2012-08-28 18 views
4

我有一個簡單的.htaccess文件,內容如下。使用多個重寫規則?

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule ^(.*)$ index.php?s=$1 [L] 
</IfModule> 

我想添加此規則。

RewriteRule ^p$ index.php?p= 

我試過在下面這樣做,但它不起作用。似乎兩條規則都在運行。我嘗試了幾個不同的標誌,並再次沒有運氣。有人能告訴我如何得到這個工作,請。

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule ^p$ index.php?p= 
    RewriteRule ^(.*)$ index.php?s=$1 [L] 
</IfModule> 

回答

5

你應該知道:第一,重寫條件隻影響下面的重寫規則,在您添加的重寫條件和重寫之間的新規則規則,他們現在只會影響你的新規則而不是舊規則(你在代碼中的含義是隻有當目標url不是文件或目錄時才執行重寫規則),所以如果你想要你的舊規則仍會受到重寫條件的影響,您必須在重寫條件之前添加新規則。

對於你的問題,我認爲samsamX已經足夠回答了(它通過添加[L]標誌來解決)。

在最後你應該有這樣的事情:

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    RewriteRule ^p$ index.php?p= [L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?s=$1 [L] 
</IfModule> 
25

您必須添加[L]標誌停止閱讀規則,當一個匹配:

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule ^p$ index.php?p= [L] 
    RewriteRule ^(.*)$ index.php?s=$1 [L] 
</IfModule> 

RewriteRule標誌提醒:

  • L =最後。一旦匹配,就停止處理RewriteRules。訂單數!
  • C =鏈。繼續處理下一個RewriteRule。如果這個規則不匹配,那麼下一個規則將不會被執行。稍後再說。
  • E =設置環境變量。 Apache具有各種可能影響Web服務器行爲的環境變量。
  • F =禁止。如果此規則匹配,則返回403-Forbidden錯誤。
  • G =走了。如果此規則匹配,則返回410-Gone錯誤。
  • H =處理程序。強制將請求處理爲指定的MIME類型。
  • N =下一步。強制規則重新開始並重新匹配。小心!可能導致循環。
  • NC =無案例。允許[jpg]匹配JPG和JPG。
  • NE =無法逃脫。防止將特殊字符(。?#&等)重寫爲其等價的十六進制代碼。
  • NS =無子請求。如果您使用的是服務器端包含,這將阻止與包含文件匹配。
  • P =代理。強制規則由mod_proxy處理。透明地提供來自其他服務器的內容,因爲您的Web服務器將其提供並重新提供。這是一個危險的標誌,因爲寫得不好的將會把你的網絡服務器變成一個開放的代理服務器,這很糟糕。
  • PT =通過。考慮RewriteRule匹配中的別名語句。
  • QSA = QSAppend。當原始字符串包含查詢(http://example.com/thing?asp=foo)時,將原始查詢字符串追加到重寫的字符串中。通常它會被丟棄。對於動態內容很重要。
  • R =重定向。提供HTTP重定向到指定的URL。也可以提供精確的重定向代碼[R = 303]。非常類似於RedirectMatch,它更快,應儘可能使用。
  • S =跳過。跳過這條規則。
  • T =類型。指定返回內容的MIME類型。非常類似於AddType指令。從這個(非常)完成後

提取物:https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-as