[L]标志如何导致我的网址部分复制?

时间:2013-07-02 19:50:50

标签: php .htaccess mod-rewrite

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

  1. 请求网址以foo/baz
  2. 开头
  3. 请求匹配第一条规则,重写为bar/baz
  4. 请求继续处理并与RewriteCond
  5. 匹配
  6. 请求也匹配下一条规则,重写为index.php?request=bar/baz
  7. 新的迭代从index.php?request=bar/baz
  8. 的请求开始
  9. 新请求不符合规则,是最终输出
  10. 用[L]:

    1. 请求网址以foo/baz
    2. 开头
    3. 请求匹配第一条规则,重写为bar/baz
    4. 新的迭代从bar/baz
    5. 的请求开始
    6. 请求在RewriteCond
    7. 之前不匹配
    8. 请求匹配下一个规则,重写为index.php?request=bar/baz
    9. 新的迭代从index.php?request=bar/baz
    10. 的请求开始
    11. 新请求不符合规则,是最终输出
    12. 在这个简化的场景中,我无法理解baz如何重复。我有什么误会?

      编辑:在第一个RewriteRule下方添加此内容会导致$_GET['request']的最终test/baz。不确定这意味着什么:

      RewriteCond %{REQUEST_URI} ^/foo/baz$
      RewriteRule ^bar/baz/baz$ /test
      

1 个答案:

答案 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.