2012-03-15 66 views
0

使用mod_rewrite,我想有兩個規則:多mod_rewrite的規則產生重定向循環

  • 重寫的.htm和.html請求.PHP
  • 刪除擴展名爲.php

使http://example.com/page.html調用http://example.com/pagehttp://example.com/page.php調用http://example.com/page

我試過這個whi當我引入.html規則時,ch會中斷:

Options +FollowSymlinks 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.htm(.*)$ http://%{HTTP_HOST}/$1.php [R,NC] 
RewriteRule (.*) $1.php [R=301, L] 

我對mod_rewrite比較陌生;任何人都可以告訴我如何糾正我的代碼?

回答

0

您的RewriteCond條件太弱,無法捕捉重寫循環;他們只檢查被重寫的路徑是要求一個具體的文件或目錄。

是的,你的第一個重寫規則應該停止循環,但條件只適用於第一個RewriteRule;你的第二個RewriteRule是無條件的。每個RewriteRule都有自己的RewriteCond -s。

(第一條規則仍然可以循環,因爲輸入可能包含.htm多次;在每個重寫一輪刪除一個.htm由不包括包含在重寫.htm比賽的一部分。)

你的第二個RewriteRule是一個相對重寫。如果這是.htaccess文件或<Directory>配置(每個目錄上下文),則需要RewriteBase。否則,重寫將採取http://example.com/foo並生成形式爲http://example.com/path/to/docroot/foo.php的網址,該網址僅在您的設置被黑掉才能接受/path/to/docroot/作爲與/同義的網址時纔有效。