mod_rewrite指向index.php的现有目录添加了查询字符串,但适用于不存在的目录

时间:2016-09-05 03:35:37

标签: php apache mod-rewrite

所以我的目录结构是这样的:

vhostrootdir/
|- app/
|- public/
   |- css/
   |- img/
   |- js/

这是我的重写:

ServerName vhostname
<Directory  "vhost/root/dir">
    Options FollowSymLinks
    AllowOverride None
    Require local

    RewriteEngine On
    RewriteCond %{CONTEXT_DOCUMENT_ROOT}/public/$1 -f
    RewriteRule ^((?s).*)$ public/$1 [END]
    RewriteRule ^((?s).*)$ index.php?_url=$1 [END]
</Directory>

如果我转到vhostname/whatever,那么我的php $_GET["_url"]会返回whatever,地址栏会根据需要保留vhostname/whatever

但是,如果我转到vhostname/public,则$_GET["_url"]public/。请注意额外的&#39; /&#39;,尽管这并不会让我感到困扰。 问题是浏览器地址栏也会更改为 vhostname/public/?_url=/public ,我绝对不想要。

如果我转到vhostname/public/(请注意附加的&#39; /&#39;),这会让您感到困惑,那么它就能正常运行。我认为$_GET["_url"]public/且地址栏无法更改。

如果我转到vhostname/app,情况就是一样。

编辑: 原来这是一个浏览器历史记录问题。我清除了Chrome的历史并修复了它。没关系,没有解决它。将DocumentRoot更改为公用文件夹后,它仍然发生在公共和应用程序URL上,但随后清除它停止发生的历史记录,现在正在公用文件夹子文件夹中发生。

2 个答案:

答案 0 :(得分:0)

请注意,您希望将DocumentRoot指向public /,因为app /不应通过网络访问。

在此示例中,设置空路径将导致_url == none,否则_url将包含添加的任何路径。

ServerName vhostname
DocumentRoot /vhost/root/dir/public
<Directory "/vhost/root/dir/public">
    AllowOverride none
    Require local
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^$ index.php?_url=none [NC,QSA,L]

        # we need to serve static files
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # pass the path to _url
        RewriteRule ^(.+)$ index.php?_url=$1 [NC,QSA,L]
    </IfModule>

答案 1 :(得分:0)

好的,我相信我已经找到了问题。因为重写之前的URL正在解析为目录,并且因为我省略了尾随/,所以apache会自动发送301 Moved Permanently重定向并添加尾随/。我想由于订单apache做了一些事情,重定向也是重写,而不是301从http://<vhostname>/img重定向到<vhostname>/img/,它被301重定向到<vhostname>/img/?_url=img

我终于修复了这个(我认为),将DirectorySlash off添加到我的虚拟主机中。