Dot-Htaccess

HSTS 和雙重重定向

  • September 12, 2018

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

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

錯誤:HTTP 首先重定向到 www

http://example``https://example(HTTP) 應在添加 www 子域之前立即重定向到(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 的正確方法是什麼?並且:有任何風險嗎?

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 和域頂點)的請求。


進一步閱讀:

引用自:https://serverfault.com/questions/930368