RewriteRule规则顺序和标志

时间:2011-03-31 19:02:31

标签: mod-rewrite apache2

我遇到了RewriteRule标志的问题。我有一个“主”RewriteRule来处理我的应用程序,但我也有一些需要以不同方式处理的URL(将它们视为自定义路由)。

我尝试了许多不同的旗帜,但它从未给我我想要的结果。检查代码中的第一条评论是否符合我的要求。

# First check if this pattern is found, and if it's not, continue to the next one and disregard this one
RewriteRule ^test/report/([0-9]+)/?$ index.php?page=report&id=$1 [PT,L]

RewriteRule ^(.*)/?$ index.php?page=$1 [PT,L]

提前致谢!

1 个答案:

答案 0 :(得分:0)

您在第一条规则上使用C标志进行链接,这意味着如果第一条规则不匹配,第二条规则将被忽略。您的评论描述了没有C标志会发生什么。我想你可能想要一个L标志,如果你想避免在第一个规则匹配时应用第二个规则。

修改

现在你已经在第一条规则上将C标志更改为L,还有另一个问题。您需要确保RewriteRule指令不会以某种方式重新处理重写的路径,从而改变它。

在这种情况下,实现该目标的一种方法是确保页面本身尚未重写为index.php:

RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^test/report/([0-9]+)/?$ index.php?page=report&id=$1 [PT,L]

RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)/?$ index.php?page=$1 [PT,L]

不幸的是,我不知道如何让相同的RewriteCond适用于你的所有规则,而不是在每个规则之前重复它。

修改

现在我想到了,是的,可能有一个更好的解决方案。而不是使用RewriteCond指令,从:

开始
RewriteRule ^index.php - [PT,NC,L]

现在,以index.php开头的任何东西都会匹配,没有任何变化,也不会再跟随RewriteRules。