我设置了一个简单的 .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