两个几乎相同的RewriteRules,一个工作,一个不工作?

时间:2012-04-26 15:03:05

标签: .htaccess

我希望将所有内容重定向到index.php,所以我认为这应该有效:

RewriteEngine on
RewriteRule ^(.*)$ /index.php?url=$1 [L]

..但事实并非如此。这个非常相似的RewriteRule确实有效:

RewriteEngine on
RewriteRule matches/(.*) /index.php?url=$1 [L]

我后来发现要让你需要的第一个工作:

RewriteCond %{REQUEST_FILENAME} !-f

有人可以解释为什么在前一个例子中需要最后一个RewriteCond而不是后者吗?

1 个答案:

答案 0 :(得分:3)

因为第一条规则将重写已经重写的网址。

RewriteRule Last [L] flag not working?

例如:

  • 原始请求:/hello/pink-kitten
  • 第1次(初始)重写:/index.php?url=hello/pink-kitten
  • 第二周期:重写为/index.php?url=index.php
  • 第3个周期:重写为/index.php?url=index.php
  • 没有更多周期,因为第3个周期产生与第2个相同的结果

为什么规则在添加条件时有效?因为条件明确表示 - 只有在请求的网址不是文件时才重写。因此,在第二个周期中,由于/index.php是一个文件,因此不会再次重写URL,因此不再有周期。

为什么第二条规则就是这样?因为它已内置条件 - 其中应包含matches/,并且您可以看到重写的网址/index.php?url=没有matches/部分。