我有一大堆重写规则,如下所示:
RewriteRule ^foo foo.php?blah [L]
RewriteRule ^bar foo.php?baz [L]
然后我有一种包罗万象的规则,我只想在上述规则不匹配的情况下申请(例如,对于/blatz
)。只要我记得包含[L]
,那就行得很好 - 但我已经两次因意外遗忘而遇到过问题。
如果先前的规则匹配,是否有任何简单的方法可以强制我的全部规则不匹配?(理想情况下,不会在每条规则中附加内容)
答案 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
反向引用。