0

我在我的服务器 documentroot 的子文件夹中上传了一个新网站,(www.example.com/demos/website-name)就像我向客户展示演示一样。

在我的 cms 中,我使用mod_rewrite将所有请求推送到index.phpphp 中并进行“内部”重写,因此我必须检索它$_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_URIMainConfig::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;
}
4

0 回答 0