我要mod_rewrite的以下鏈接:網址國防部重寫
前:
website.altervista.org/page.php?name=value
後:
website.altervista.org/value
我要mod_rewrite的以下鏈接:網址國防部重寫
前:
website.altervista.org/page.php?name=value
後:
website.altervista.org/value
解決方案:
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
說明:
mod_rewrite的RewriteRule
有3個參數:
實現爲這樣:
RewriteRule pattern substitution [flags]
始於服務器根,請在RewriteRule
「模式」參數所請求的URL的路徑,並在「取代」參數所需的路徑。在這種情況下:
RewriteRule ^(.+)$ /page.php?name=$1 [L]
如果URL變化,你不希望(或不能)編寫規則每一種情況,然後使用正則表達式^(.+)$
捕捉動態值,並將其注入到您的替代路徑使用RE捕獲變量$1
。第一組圓括號是$1
,第二組是$2
等,並且可以嵌套捕獲括號。
^(.+)$
這個正則表達式可以理解爲:在字符串的開頭^
,$
一路字符串的結尾,尋找.
任何字符+
一個或倍和()
捕獲該值放入一個變量。
問題:
即使我們有標誌[L]
(最後一條規則計算的),mod_rewrite的引擎(幕後)將新建成的請求/page.php?name=somevalue
回到通過mod_rewrite的引擎,直到沒有規則或者顯然,請求沒有變化。幸運的是,有一個支持指令來擴展RewriteRule
提供的條件性能RewriteCond
。
mod_rewrite的RewriteCond
適用於下一個出現的RewriteRule
並且還具有3個參數:
測試字符串可以來自幾個來源。通常,與當前請求相關的服務器變量在此用作此情況的主題。
條件模式又是文本或正則表達式,但有一些額外的特殊條件可以評估。詳細解釋請閱讀Apache online mod_rewrite documentation。
在這種情況下:RewriteRule ^(.+)$ /page.php?name=$1 [L]
,我們剛剛取代請求通過了mod_rewrite送回爲/page.php?name=somevalue
和我們的「無所不包」的規則,因此我們原來的「someValue中」消失,並與我們的新請求的資源page.php
更換相匹配。爲了防止我們的「全部抓住」捕捉我們的「page.php」請求,讓我們使用RewriteCond
從規則中排除它。
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
這RewriteCond
可以理解爲:%{REQUEST_URI}
獲得所請求的資源,並且做得非常!
不$
結束與page.php
。如果這種情況屬實,繼續下一個條件或規則。如果此條件不成立,請跳過此規則集並繼續到下一個規則集。