this是一個很好的參考。總結相關部分:
在
的SO質疑你是指,在OP想index.php?page=mobile
成爲index/page/mobile
和接受這個問題的答案是:
RewriteEngine on
RewriteBase /cashearn/
RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
RewriteRule^index/page/%1? [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index/page/([^/]+)/?$ index.php?page=$1 [L,QSA,NC]
在爲了理解這是如何工作的,我們來仔細看看這個部分:
RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
RewriteRule^index/page/%1? [R=302,L]
RewriteCond是一個必須匹配的條件才能使用後續的RewriteRule。 模式匹配使用正則表達式完成。基礎很容易掌握,所以我建議你看看它。在任何情況下,形式%N
(例如%1
)的任何形式都是對當前條件集合中的最後一個RewriteCond的模式的「分組」部分的反向引用。 「分組」部分用圓括號表示。換句話說,RewriteRule中的%1
指的是RewriteCond中的([^\s&]+)
。
看着正則表達式:
正則表達式中的方括號表示一個字符類,所以[^\s&]
因此是一個字符類。 插入符號^
當它是裏面字符類表示否定。 \s
是空格字符的轉義碼。因此,總而言之,[^\s&]
表示「除空白以外的任何字符」和「&
」。字符類附加了+
,意思是「一個或多個」。所以,正則表達式模式將匹配字符類中包含的字符之一。對於url而言,這基本上是指字母,數字和%
的任意組合。
除了「服務器變量」%{THE_REQUEST}
之外,RewriteRule和RewriteCond中的其他字符都是正則表達式的特殊字符或文字。 (文字我的意思是ab
在正則表達式將匹配字符串cab
。)
^
,當不在字符類內時,插入符號是一個特殊字符,表示一行的開始。注意?
和.
這裏也是文字,儘管它們包含在正則表達式「特殊字符」列表中。那是因爲他們逃脫了\
。
唯一剩下解釋爲標誌[NC]
和[R=302,L]
NC
指不區分大小寫。 L
表示最後,即如果匹配,則後續規則將而不是被處理。 'R'表示「重定向」,302
是重定向的HTTP狀態碼。
內部和外部重定向之間的區別與此處相關。通過內部重定向,服務器將靜靜地從新形成的URL指定的文件路徑中獲取資源,而用戶仍然可以在瀏覽器中看到原始URL。 R
標誌表示外部重定向,這會導致用戶使用新形成的URL啓動新的HTTP事務。省略R
用於內部重定向。
嗯。這似乎並沒有改變網址。不知道爲什麼。 – gin93r 2014-11-06 16:34:32
你在瀏覽器中輸入什麼URL?你想在瀏覽器中看到'example.com/prefix-suffix.html?v = huzzah',還是想在瀏覽器中看到'example.com/prefix/suffix/huzzah'? – anubhava 2014-11-06 16:39:32
最終結果是我想在瀏覽器中看到'example.com/prefix/suffix/huzzah'。 – gin93r 2014-11-06 16:42:45