我想知道下面的mod_rewrite代碼是做什麼的,有人可以詳細解釋代碼嗎?下面的mod_rewrite代碼是做什麼的?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
我想知道下面的mod_rewrite代碼是做什麼的,有人可以詳細解釋代碼嗎?下面的mod_rewrite代碼是做什麼的?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
逐行解釋:
RewriteRule .* index.php [L]
將被解釋第一和每一個請求相匹配(對主機名和端口後的URL部分匹配,並且查詢字符串之前)。 .*
是一個匹配所有時間的正則表達式。更好更快的規則可能是:
RewriteRule^index.php [L]
在正則表達式來^
,每一個都有一個開始字符串相匹配。這相當於.*
- >匹配所有東西。
找到匹配後,處理將繼續執行RewriteCond
(itions)。 這兩個RewriteConditions鏈接在一個看不見的邏輯AND
。只有在兩個RewriteConditions都爲真時,該塊纔會匹配。
RewriteCond %{REQUEST_FILENAME} !-f # Check if given file is not a file AND
RewriteCond %{REQUEST_FILENAME} !-d # Check if given directory is not a file and
示例:如果您將在服務器上具有以下文件結構。
.
|-- css
| `-- base.css
|-- img
| `-- logo.png
`-- index.php
如果請求URL example.com/ CSS/base.css以下步驟會發生。
RewriteCond %{REQUEST_FILENAME} !-f
,因爲css/base.css
是一個文件。RewriteRule
將被跳過,因爲沒有發生匹配,如果請求URL example.com/ EN /約以下步驟會發生處理將測試其他規則和條件*。
RewriteRule
(符合所有的時間)RewriteCond %{REQUEST_FILENAME} !-f
,因爲en/about
是沒有文件。RewriteCond %{REQUEST_FILENAME} !-d
,因爲en/about
沒有目錄。RewriteRule
和RewriteCond
創建了一個肯定的匹配 - >index.php
旗L
國旗L
裝置最後一個規則,這將停止的處理。更多關於flags。
此規則組合通常用於將所有請求重定向到Web應用程序的單個入口點。爲避免通過index.php
提供靜態內容,文件和目錄將由web服務器提供,而不是由index.php提供。動態站點請求的分派將在index.php
的邏輯內完成。
*可以找到正確的數據流量here
它重寫不磁盤上的文件((!-f)
)或目錄((!-d)
)匹配的index.php所有請求。 [L]
告訴mod_rewrite在此之後停止處理規則。