2015-03-13 83 views
13

我一直在尋找完美的301重定向。但我找到了很多解決方案,不知道什麼是最好的。最佳實踐:301將HTTP重定向到HTTPS(標準域)

這是我想要做的

最佳實踐.htacess?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

這是我的首選代碼。至少現在開始。

替代方式

我也發現了很多其他的方法來重定向從HTTPHTTPS。例如:

1.

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

缺少一個步驟?並且在這裏沒有[R=301,L]

2.

RewriteCond %{HTTP_HOST} !^www\. 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Is a different order generally better

我應該使用的

RewriteRule ^(.*)$ 

代替

RewriteRule (.*) 

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} example\.com$ [NC] 
RewriteRule^https://example.com%{REQUEST_URI} [R=301,L,NE] 

是否使用完整的域名有什麼性能優勢?我真的需要NE嗎? ([R=301,L,NE][L,R=301]

所以,我的問題都是專家:什麼是最好的(表演)的方式無論從HTTP重定向到HTTPSHTTPS://

回答

13

要開始與你最喜歡的解決方案:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

在部件處理非HTTPS URL要重定向到%{HTTP_HOST}。然後,如果您的主機名以「www」開頭,則必須發生第二次重定向,以便將您從https://www.domain.tld發送到https://domain.tld,這應該是您的最終目的地。

您可以通過直接在第一條規則使用

RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301] 

縮短這個。第二條規則將僅適用於試圖訪問https://www.domain.tld的客戶。

備選方案1.因相同原因(缺少HTTP_HOST可能爲www.domain.tld)以及另外由於缺少[L,R=301]而不起作用。這是必要的,因爲您不只是在這裏重寫URL,就像您可以在其他類型的重寫規則中一樣。您正在請求客戶更改其請求的類型 - 這就是您爲他發送301的HTTP代碼的原因。

關於RewriteRule本身的匹配部分,您應該保持一致:如果要捕獲部分URI,您將使用帶括號的正則表達式。事實上,在這裏使用它作爲一個整體,只需使用其中一個「任何」選項即可,如^,稍後使用%{REQUEST_URI}即可。 如果你使用一些捕捉(即(some_regex)你應該使用$1(或任何你要參考)這裏引用它的目標。

在你的第三個選擇,再次WWW + HTTPS丟失。

您可以檢查HTTPS是關閉如果域名包含在一個規則中的「www」前綴,但是重寫條件含蓄與連接「和」

因此,它應該閱讀:

RewriteCond %{HTTPS} off   [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule^https://domain.tld%{REQUEST_URI} [R=301,L,NE] 

的NE是必要的傳遞之類的GET參數,併到新的URI不變等,參見:

http://httpd.apache.org/docs/2.4/rewrite/flags.html

+0

非常感謝。我現在使用這個代碼: RewriteEngine On RewriteCond%{HTTPS} off RewriteRule ^(。*)$ https://example.com/%{REQUEST_URI} [R = 301,L ,NE] RewriteCond%{HTTP_HOST}^www \。(。+)$ [NC] RewriteRule^https://%1%{REQUEST_URI} [R = 301,L,NE] dash 2015-03-13 19:27:15

+0

我知道它是一個稍微老的答案,但不會從替代方案3的返回中返回,例如'RewriteRule^https://domain.tld/% {REQUEST_URI} [R = 301,L,NE]',例如https://domain.tld//index.html用雙斜槓?不應該在靜態域文本和'%{REQUEST_URI}'之間沒有斜線的情況下讀取'RewriteRule^https://domain.tld/% {REQUEST_URI} [R = 301,L,NE]'? – 2017-11-07 08:32:03

+0

你是對的:我剛纔更正了這個 – nlu 2017-11-09 14:06:00

2

因此,冷凝,這成爲;

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule^https://example.com%{REQUEST_URI} [R=301,L,NE] 

讓我知道,如果你看到任何錯誤