我在共享託管 LAMP 環境中管理一個小網站:這基本上意味著我唯一可以編輯的是 htaccess 檔案。
我想添加 HSTS 支援(我做到了),但是,當我在這裡測試了我的網站對於 HSTS 預加載資格,我收到以下錯誤:
錯誤:HTTP 首先重定向到 www
http://example
https://example
在新增 www 子網域之前,(HTTP) 應立即重新導向至(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 的正確方法是什麼?還有:有什麼風險嗎?
答案1
正如上面所指出的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