RewriteRules 没有因 LAST 标志而停止?

RewriteRules 没有因 LAST 标志而停止?

我似乎在使用 Apache 2.2 的 Rewrite 模块(在 FreeBSD 8 上运行)时遇到了问题。我的.htaccess文件如下:

Options -Indexes

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L] 

但不知何故,最后一条规则覆盖了其他三条规则。一旦我将其注释掉,其他规则就会按预期工作:

  • www.example.com/xpaste打开cross.php
  • www.example.com/x132633打开cross.php?id=132633
  • www.example.com/gen打开index.php?gen

我尝试了每个 上的 、 和 标志的各种组合LNSS=n除非RewriteRule我注释掉最后一条规则,否则所有内容都会被定向到index.php。如何让 ApacheRewriteRule在找到匹配项后停止处理 s?

答案1

RewriteRule 生成一个 INTERNAL REDIRECT,然后从第一个 RewriteRule(RewriteRule ^xpaste$ cross.php [L]) 开始重复处理。您需要在最后一个 RewriteRule 之前添加 RewriteCond:

 RewriteEngine on
 RewriteRule ^xpaste$ cross.php [L]
 RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
 RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
 RewriteCond %{REQUEST_URI} !^/(cross|index)\.php$
 RewriteRule ^(.*)$ index.php [L]

答案2

最后一条规则上的 NS 应该有效。也可以在其他规则上这样做,不会造成任何损害。我正在做“[L,NS]”,在有 L 的地方添加 NS。

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L,NS] 

我还没有测试过这些,但这里有一个有趣的方法,对于更通用的解决方案,使用 IS_SUBREQ 变量。 https://stackoverflow.com/questions/9555247/can-anyone-think-of-when-a-sub-request-rewrite-is-useful

这篇文章也提到了 REDIRECT_STATUS 变量。 http://www.webmasterworld.com/apache/4299003.htm

相关内容