HSTS 和雙重定向

HSTS 和雙重定向

我在共享託管 LAMP 環境中管理一個小網站:這基本上意味著我唯一可以編輯的是 htaccess 檔案。

我想添加 HSTS 支援(我做到了),但是,當我在這裡測試了我的網站對於 HSTS 預加載資格,我收到以下錯誤:

錯誤:HTTP 首先重定向到 www

http://examplehttps://example在新增 www 子網域之前,(HTTP) 應立即重新導向至(HTTPS)。現在,第一個重定向是https://www.example.需要額外的重定向以確保任何支援 HSTS 的瀏覽器都會記錄頂級網域的 HSTS 條目,而不僅僅是子網域。

所以,我想我應該這樣重定向用戶:

  1. http://example(這是使用者在瀏覽器網址列中輸入的內容)
  2. https://example(我們將他重新導向到該網站的 HTTPS 版本)
  3. 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預載清單提交要求

  1. 如果您正在偵聽連接埠 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 和網域頂點)。


延伸閱讀:

相關內容