1

我希望将所有内容都重定向到 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 而不是后者吗?

4

1 回答 1

3

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

RewriteRule Last [L] 标志不起作用?

例如:

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

如果添加该条件,为什么规则有效?因为条件清楚地表明——只有在请求的 URL 不是文件时才进行重写。因此,在第 2 次循环中,URL 不会像/index.php文件一样被再次重写,因此不再需要循环。

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

于 2012-04-26T15:17:05.490 回答