2014-04-10 63 views
1

我有一個非常基本的重寫規則,我一直在試圖實現我的頭撞牆。我有一個靜態HTML網站,我想要漂亮的URL。重定向和重寫從url中刪除.html

所以,我想/something服務/something.html,我也想從/something.html重定向(外部)到/something爲不SEO受到懲罰主辦重複的內容。

我不希望使用在Multiviews,我不希望使用<rel cannonical="">

這是我現在有。

RewriteRule ^(.*)\.html$ /$1 [R=302,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html [L] 

它導致無限重定向循環。

在我看來,第一條規則即使在請求的URL不以.html結尾後仍然保持匹配。

回答

1

是的,您的規則將導致重定向循環,因爲使用了REQUEST_URI(通過RewriteRule),該規則在應用規則後發生了變化。

您可以使用:

RewriteCond %{THE_REQUEST} \.html [NC] 
    RewriteRule ^(.*)\.html$ /$1 [R=302,L] 

    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME}\.html -f 
    RewriteRule ^(.*)$ $1.html [L] 
  • THE_REQUEST變量代表從您的瀏覽器Apache接收到原始請求,並沒有得到一些重寫規則執行後覆蓋。
+0

假設我要求/something.html。第一次通過我應該擊中第一條規則,並從外部重定向到/某物。根據這一要求,爲什麼第一條規則甚至匹配?或者第二條規則得到執行,那麼第一條規則會再次運行? –

+0

是的第一條規則是301對'/ something'進行操作,然後第二條規則將內部對象改變爲'/ something.html',然後第一條規則再次運行並使其成爲'/ something'等等。只要記住,只要有匹配的規則,mod_rewrite就會一直運行你的循環。 – anubhava

+0

即使你有[L]標誌? –