2010-01-20 90 views
25

鑑於這些情況(我知道他們的意思/做):mod_rewrite:這個RewriteRule做什麼?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

什麼是第一規則呢?那孤獨的衝刺是什麼?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

我一直在使用這一段時間與Zend框架組合,但我從來沒有真正得到第一項規則究竟是什麼。

回答

46

RewriteCond directive只是描述了RewriteRule directive的附加條件。因此RewriteCond必須始終與RewriteRule關聯。

在你的情況這三個RewriteCond可能屬於第一RewriteRule這樣的:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

現在,如果RewriteRule的模式當前請求的URL匹配此規則適用(每個目錄路徑之前剝離)如果條件滿足,則爲

在這種情況下,如果映射請求URL到它要麼與文件大小大於0(-s),或一個符號鏈接(-l)或目錄的現有文件相匹配的文件系統時的條件是唯一的真正(-d )。因此,您的規則將應用於任何可映射到文件系統中存在的URL的任何URL(^.*$匹配任何內容)。替代-只是意味着不改變任何東西。和NC任何情況下,不區分大小寫,無用在這種情況下),並大號(如果應用的最後一個規則)是flags修飾任一圖案,更換或規則的執行。

+0

Aaahh是的,這是有道理的。非常明確的解釋。謝謝。 – 2010-01-20 15:02:29

+0

那麼不改變它的目的是什麼?兩個重寫規則的組合是否表示「是否存在,顯示它,否則將其他所有內容轉發到index.php」 – 2014-10-20 10:57:29

+1

@WillshawMedia是的,所提到的規則基本上保留了對現有文件的任何請求不變,並退出重寫過程。所以結合其他規則:只將任何不存在的文件重寫爲* index.php *。 – Gumbo 2014-10-20 14:49:21