2015-03-13 442 views

回答

1

解決方案:

RewriteCond %{REQUEST_URI} !page.php$ 
RewriteRule ^(.+)$ /page.php?name=$1 [L] 

說明:

mod_rewrite的RewriteRule有3個參數:

  1. 模式
  2. 換人
  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個參數:

  1. 測試字符串
  2. 條件模式
  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。如果這種情況屬實,繼續下一個條件或規則。如果此條件不成立,請跳過此規則集並繼續到下一個規則集。