2016-06-28 54 views
-1

請幫我找到這種行爲的解決方案,這對我來說很陌生。mod_rewrite規則匹配,但鏈沒有離開

這裏是我的htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule  ^emltr\.gif$     aaa.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$       index.php [L,QSA] 
</IfModule> 

注意了L位,所以我要說的是,當「GIF」規則匹配時鏈條離開。 但事實並非如此。

請求的URL是「emltr.gif」

如果「包羅萬象」的規則和條件註釋,那麼「GIF」規則正確服用。 (「aaa.html」不存在,這是一種防止不必要的循環行爲的測試。)

如果「全面通過」規則未註釋,則採用IT,而不是第一條規則。爲什麼第二個而不是第一個?否則:爲什麼不是即使L標誌離開鏈條,然後評估第二條規則?

謝謝

+0

這就是L的工作原理,它會停止重寫迭代。當規則匹配時,您可以使用END而不是L來立即結束重寫過程 – starkeen

回答

1

這在手動L|last

的[L]標誌導致mod_rewrite的停止處理規則集記錄。 在大多數情況下,這意味着如果規則匹配,則不會處理更多規則。

如果您在.htaccess文件或<Directory>部分中使用RewriteRule,...簡化的形式是,一旦處理了規則,重寫的請求就會交還給URL解析引擎,以執行它可能會用它。有可能在處理重寫的請求時,可能會再次遇到.htaccess文件或段,因此規則集可能會從頭再次運行。最常見的情況是,如果其中一個規則導致重定向(無論是內部還是外部),則會導致請求過程重新開始。

替代標誌[END]可用於終止當前一輪重寫處理,但可防止在每個目錄(htaccess)上下文中發生任何後續重寫處理。這不適用於由外部重定向導致的新請求。

簡而言之,當您在.htaccess文件或Directory指令中重寫規則時,如果本輪重寫請求,則會再次處理該請求。只有當沒有更多的重寫時,它纔會停止。