2009-09-30 87 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