我在我的服务器 documentroot 的子文件夹中上传了一个新网站,(www.example.com/demos/website-name)
就像我向客户展示演示一样。
在我的 cms 中,我使用mod_rewrite
将所有请求推送到index.php
php 中并进行“内部”重写,因此我必须检索它$_SERVER['REQUEST_URI']
以读取它并加载正确的页面。
非常随机(并且仅当 cms 像这种情况下放置在子文件夹中时)REQUEST_URI
与浏览器中的 uri 不匹配,但仍然是前一个:例如我在"/cms/foo"
,我点击一个链接,将我"/cms/bar"
带到页面重新加载,但如果我转储REQUEST_URI
我仍然得到"/cms/foo"
。
我真的无法理解这怎么可能。
这是 .htaccess 的样子:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
这就是我如何检索REQUEST_URI
(MainConfig::ROOT_URL
是子文件夹路径“/demos/website-name”):
public static function getPath()
{
if(isset(self::$cache['path'])) {
return self::$cache['path'];
}
if(isset($_SERVER['REQUEST_URI'])) {
$path = str_replace(MainConfig::ROOT_URL, '', $_SERVER["REQUEST_URI"]);
$path = explode('/', $path);
if(trim($path[1]) == '') {
$path = array();
}
unset($path[0]);
$path = array_values($path);
for($i = 0; $i < count($path); $i++) {
$fragment = $path[$i];
if(strpos($fragment, '?') !== false) {
$lastPathIndex = $i;
break;
} elseif(strpos($fragment, 'index.php') !== false) {
$lastPathIndex = $i;
break;
}
}
if(isset($lastPathIndex)) {
$lastPathElement = array();
$length = count($path);
for($i = $lastPathIndex; $i < $length; $i++) {
$lastPathElement[] = $path[$i];
unset($path[$i]);
}
$lastPathElement = str_replace('index.php', '', implode('/', $lastPathElement));
}
if(isset($lastPathElement)) {
$path[] = $lastPathElement;
}
} else {
$path = array();
}
$path = array_values($path);
self::$cache['path'] = $path;
return $path;
}