2013-01-08 60 views
1

鑑於下面的條件和規則,mod_rewrite如何驗證請求是文件還是目錄?mod_rewrite如何驗證請求是文件還是目錄?

RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

我的理解是,如果請求不是一個文件不是一個目錄,然後處理它有模式不是一個問號任何字符,替代作爲與後臺查詢字符串重寫規則參考$1

是不是每個請求一個文件或目錄例如index.php,style.css,媒體等?如果滿足條件是

RewriteCond %{REQUEST_FILENAME} -f [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

其內容是,如果該請求是一個文件一個目錄,然後處理重寫規則

回答

0

按照mod_rewrite documentationREQUEST_FILENAME是:

文件或腳本的完整本地文件系統路徑,與 請求相匹配(如果服務器已在時間 處確定),則REQUEST_FILENAME爲引用NCED。否則,如在虛擬主機上下文中使用 時,與REQUEST_URI的值相同。

您可以將它想象爲一個可能存在或不存在於真實文件系統上的路徑。傳入的請求可能類似於http:\\ example.com \ blah.php。如果這是一個真正的文件,那麼你說你想使用它。但是服務器上可能沒有一個名爲blah.php的真實文件。在這種情況下,您將請求傳遞到名爲index.php的文件中,而不是返回404錯誤。

總之,您不應該將URL的部分視爲文件或目錄。他們不需要映射到真正的文件系統路徑(儘管他們經常這樣做)。

+0

謝謝馬修。所以讓我明白你在說什麼。以'http:\\ example.com \ blah.php'爲例,用'RewriteCond%{REQUEST_FILENAME}的條件和規則!-f RewriteCond%{REQUEST_FILENAME}!-d RewriteRule ^([^?] * )index.php?_route _ = $ 1 [L,QSA]',如果存在'blah.php',則表示使用'blah.php'。如果它不存在,那麼將用戶重定向到'index.php'。是對的嗎? – PeanutsMonkey

+0

正確,儘管技術上第一部分僅僅是默認行爲,但規則集僅明確地說明了第二部分。 – matthew

+0

對不起,不完全按照第一部分和第二部分的意思嗎?除此之外,我嘗試了規則,它似乎並沒有加載任何CSS文件,JavaScript文件等,除非我做了'RewriteCond%{REQUEST_FILENAME} -f RewriteCond%{REQUEST_FILENAME} -d RewriteRule ^([^?] *)'。這是爲什麼? – PeanutsMonkey

相關問題