2009-09-30 88 views
0

我有类似下面的一大组重写规则:mod_rewrite:仅在没有以前的规则匹配时匹配?

RewriteRule ^foo foo.php?blah [L] 
RewriteRule ^bar foo.php?baz [L] 

然后,我有一种包罗万象的规则,我想如果上述规则不匹配仅适用(例如,例如/blatz)。只要我记得包括[L],这工作正常 - 但我已经有两次意外忘记它的问题。

如果以前的规则匹配,是否有任何简单的方法来强制我的捕捉规则到不匹配(理想情况下,没有附加的东西每个规则)

回答

1

,我可以形象是要么使用S标志跳过最后一个规则的唯一解决办法:

RewriteRule ^foo foo.php?blah [L,S=999] 
RewriteRule ^bar foo.php?baz [L,S=999] 
RewriteRule … 

,或者设置环境变量:

RewriteRule ^foo foo.php?blah [L,E=FLAG:1] 
RewriteRule ^bar foo.php?baz [L,E=FLAG:1] 
RewriteCond %{ENV:FLAG} ^$ 
RewriteRule … 

编辑好吧,这里是另一种解决方案是将当前网址与原先要求之一:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^?\s]*)\??([^\s]*) 
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$ 
RewriteRule … 

但我认为,至少需要的Apache 2,因为使用POSIX ERE和POSIX ERE的Apache 1.x中不支持在模式中\n反向引用。

+0

啊哈! “确保URL尚未更改”解决方案很聪明。 – 2009-10-02 18:36:45