RewriteRules 不会以 LAST 标志停止?

Dok*_*r J 3 mod-rewrite rewrite .htaccess apache-2.2

我似乎遇到了 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] 
Run Code Online (Sandbox Code Playgroud)

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

  • 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.phpRewriteRule一旦找到匹配项,如何让 Apache 停止处理s?

oos*_*hro 6

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]
Run Code Online (Sandbox Code Playgroud)

  • 有没有更通用的解决方案,告诉Apache“如果您已经在处理重定向,请不要处理此规则”? (2认同)