我已经设置了一个简单的.htaccess文件来将请求定向到示例index.php文件,如下所示:
RewriteEngine On
RewriteRule ^foo/(.*)$ bar/$1 # [L] here changes output
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?request=$1
访问devserver.com/foo/baz
会产生$_GET['request']
bar/baz/baz
。将[L]
标记添加到第一个RewriteRule
会产生bar/baz
的预期结果。
我读过许多人误解[L]旗帜的问题/答案,认为它会结束所有重写。我知道情况并非如此,并且看不出[L]旗帜应该如何在这里真正发挥作用。
以下是我设想的步骤,首先没有[L]:
foo/baz
bar/baz
RewriteCond
index.php?request=bar/baz
index.php?request=bar/baz
用[L]:
foo/baz
bar/baz
bar/baz
RewriteCond
index.php?request=bar/baz
index.php?request=bar/baz
在这个简化的场景中,我无法理解baz
如何重复。我有什么误会?
编辑:在第一个RewriteRule下方添加此内容会导致$_GET['request']
的最终test/baz
。不确定这意味着什么:
RewriteCond %{REQUEST_URI} ^/foo/baz$
RewriteRule ^bar/baz/baz$ /test
答案 0 :(得分:1)
相反,在每个之前附加到URI的PATH_INFO 规则仅反映此轮之前PATH_INFO的值 mod_rewrite处理。因此,如果URI的大部分 匹配并复制到多个RewriteRule中的替换 指令,不考虑URI的哪些部分来自 当前PATH_INFO,最终URI可能有多个PATH_INFO副本 附加到它。
为了防止这种情况发生,你需要使用DPI标志,这样你的规则就是:
RewriteEngine On
RewriteRule ^foo/(.*)$ bar/$1 [DPI]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?request=$1
DPI标志将负责从中删除路径信息。的 You can read more here. 强>