mod_rewrite:只有先前的规则没有匹配才匹配?

时间:2009-09-30 22:30:03

标签: mod-rewrite

我有一大堆重写规则,如下所示:

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

然后我有一种包罗万象的规则,我只想在上述规则不匹配的情况下申请(例如,对于/blatz)。只要我记得包含[L],那就行得很好 - 但我已经两次因意外遗忘而遇到过问题。

如果先前的规则匹配,是否有任何简单的方法可以强制我的全部规则不匹配(理想情况下,不会在每条规则中附加内容)

1 个答案:

答案 0 :(得分: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,因为Apache 1.x使用POSIX ERE和POSIX ERE不支持模式中的\ n 反向引用。