HSTS 和雙重重定向
我在共享主機 LAMP 環境中管理一個小網站:這基本上意味著我唯一可以編輯的是一個 htaccess 文件。
我想添加 HSTS 支持(我做到了),但是,當我在這裡測試我的網站以獲得 HSTS 預載入資格時,我收到以下錯誤:
錯誤:HTTP 首先重定向到 www
http://example``https://example
(HTTP) 應在添加 www 子域之前立即重定向到(HTTPS)。現在,第一個重定向是https://www.example.
額外的重定向,以確保任何支持 HSTS 的瀏覽器都會記錄頂級域的 HSTS 條目,而不僅僅是子域。所以,我想我應該這樣重定向使用者:
http://example
(這是使用者在瀏覽器地址欄中輸入的內容)https://example
(我們將他重定向到網站的 HTTPS 版本)https://www.example
(我們再次將他重定向到子域 www)我目前的重定向是這樣完成的:
RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
我試圖在最後一行之前添加一個重定向,這樣:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
但我從瀏覽器收到“頁面未正確重定向”錯誤。
那麼,將使用者從網站的 http 版本重定向到 https 並最終重定向到帶有 www 的 https 的正確方法是什麼?並且:有任何風險嗎?
如HSTS 預載入列表送出要求所述:
- 如果您正在偵聽埠 80,則在同一主機上從 HTTP 重定向到 HTTPS。
您需要重定向到同一主機(即。
HTTP_HOST
),而不僅僅是example.com
首先。example.com
如果使用者直接請求,您不需要重定向到www.example.com
。(測試將涉及對 . 的請求example.com
。)之後,如果需要,您可以重定向到規範的 www 子域。我試圖在最後一行之前添加一個重定向,這樣:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
這將創建一個重定向循環,因為前面的
RewriteCond
指令僅適用於第一個RewriteRule
,因此第二個RewriteRule
將無條件執行。請嘗試以下方法:
# HTTP to HTTPS redirect RewriteCond %{SERVER_PORT} 80 RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L] # Canonical www redirect RewriteCond %{HTTP_HOST} !^www\. RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]
HTTP_HOST
伺服器變數包含 HTTP 請求標頭的值(Host
即,正在請求的任何主機)。第二個重定向狀態……對於請求的主機未啟動的所有請求,
www.
然後作為主機的前綴www.
。但是,如果您有多個要分開的子域(解析到同一個地方),這可能是不可接受的,因為它們自然會被重定向到 www 子域。請注意,這些是 302(臨時)重定向。僅當您確定它工作正常時才更改為 301。
並且:有任何風險嗎?
沒有風險。是的,可能有兩個重定向,而以前可能只有一個(可以說效率較低)。但是仍然只有兩個重定向,這對於 SEO 來說是完全可以的。此外,使用 HSTS,使用者代理最多只會經歷一次雙重重定向。
RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
*旁白:(*暫時忽略 HSTS ……)這本身並不完整,因為它不會規範化
https://example.com/...
(即 HTTPS 和域頂點)的請求。進一步閱讀:
- 我對 Pro Webmasters SE 上的相關問題的回答更詳細地介紹了在以下位置實施 HSTS
.htaccess
:https ://webmasters.stackexchange.com/a/112264/52912