我似乎在使用 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
我尝试了每个 上的 、 和 标志的各种组合L
,NS
但S=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