1.文檔閱讀 HTTPS -> HTTP 引起的 307 狀態碼與 HSTS – Charles Feng What is the HTTP 307 Temporary Redirect Status Code - Kinsta? chrome://net-internals/#hsts 2.整理輸出 當用戶通過 HTTPS 訪問網站時,服務器可能會返回 307 狀態碼,臨時重定向到 HTTP 協議。 307 狀態碼表示請求的資源暫時移動到另一個 URL,且客戶端應繼續使用原始請求方法(如 POST)訪問新地址。 這種重定向通常由服務器配置錯誤或后端邏輯引起,例如強制降級到 HTTP 或未正確處理 HTTPS 請求。 此行為存在安全隱患: - 中間人攻擊風險:降級到 HTTP 后,傳輸數據可能被竊聽或篡改。
- 混合內容問題:若頁面通過 HTTPS 加載但部分資源(如腳本、圖片)通過 HTTP 傳輸,瀏覽器可能攔截這些資源,導致功能異常。
HSTS 機制的作用 HSTS(HTTP Strict Transport Security 「HTTP嚴格傳輸安全」) 是一種安全策略機制,通過響應頭 Strict-Transport-Security 強制瀏覽器僅通過 HTTPS 與網站通信。關鍵特性包括: - 自動轉換 HTTP 鏈接為 HTTPS:瀏覽器在訪問網站時,即使輸入
http:// 也會自動跳轉到 https:// 。 - 阻止無效證書警告繞過:用戶無法手動忽略證書錯誤繼續訪問。
- 預加載列表:網站可申請加入瀏覽器內置的 HSTS 預加載列表,首次訪問即啟用 HTTPS。
HSTS 響應頭示例: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
307 狀態碼與 HSTS 的沖突 若網站啟用了 HSTS 但服務器返回 307 重定向到 HTTP,瀏覽器會根據 HSTS 策略拒絕重定向并終止連接。此時可能出現以下情況: - 控制臺報錯:瀏覽器顯示
HTTP Strict Transport Security 攔截警告。 - 用戶無法訪問:頁面加載失敗,尤其當 HSTS 包含
includeSubDomains 或 preload 時。 解決方案 避免 HTTPS 到 HTTP 的重定向 - 檢查服務器配置(如 Nginx、Apache),確保所有重定向目標使用 HTTPS。
- 更新后端代碼邏輯,避免手動構造 HTTP 鏈接。
合理配置 HSTS - 設置較長的
max-age (如 1 年)并逐步增加。 - 測試無誤后添加
includeSubDomains 和 preload 指令。 - 通過 HSTS 預加載提交入口 申請加入瀏覽器預加載列表。
調試工具推薦 - 使用 Chrome DevTools 的 Network 面板檢查重定向鏈。
- 通過 SSL Labs 測試 HSTS 配置。
代碼示例:Nginx 強制 HTTPS 配置 server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}server {listen 443 ssl;server_name example.com;# HSTS 配置add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
測試服/開發服?-?解決 HTTPS 降級到 HTTP 引起的 307 狀態碼與 HSTS 問題 以下為開發環境中的解決方案: 禁用瀏覽器的 HSTS 強制策略 在 Chrome 地址欄輸入 chrome://net-internals/#hsts ,進入 HSTS 管理頁面。 在 Delete domain security policies 中輸入目標域名(如 localhost 或開發域名),點擊刪除。 重啟瀏覽器后,HSTS 策略將被臨時移除。  清理瀏覽器緩存與 Cookie 強制刷新頁面(Ctrl + Shift + R 或 Cmd + Shift + R )。 清除瀏覽器緩存和 Cookie,避免舊策略殘留影響測試。 開發環境配置全 HTTPS 使用自簽名證書或工具(如 mkcert )為本地開發環境啟用 HTTPS: # 安裝 mkcert(示例為 macOS)
brew install mkcert
mkcert -install
mkcert localhost 127.0.0.1 ::1
配置開發服務器(如 Node.js 的 https 模塊或 Webpack 的 devServer.https )加載生成的證書。 修改后端重定向邏輯 確保后端代碼不主動從 HTTPS 重定向到 HTTP。例如在 Express 中: app.use((req, res, next) => {if (req.protocol === 'http') {res.redirect(301, `https://${req.headers.host}${req.url}`);} else {next();}
});
臨時禁用 HSTS 響應頭 檢查后端是否返回 Strict-Transport-Security 頭,開發環境可注釋或移除該配置。 例如 Nginx 中: # 注釋以下行
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
使用無痕模式或不同瀏覽器測試 無痕模式(Incognito)默認不加載部分擴展和緩存,可避免 HSTS 干擾。 嘗試使用未訪問過生產環境的瀏覽器(如 Firefox 或 Safari)進行測試。 檢查代理或中間件配置 確保開發工具(如 Webpack DevServer)未錯誤修改請求協議。 配置代理時顯式指定目標協議: devServer: {proxy: {'/api': {target: 'https://localhost:3000',secure: false // 僅開發環境允許自簽名證書}}
}
驗證網絡層配置 檢查本地 hosts 文件是否綁定正確域名,避免 DNS 解析問題。 確保測試域名未出現在瀏覽器預加載的 HSTS 列表中(如 preload 列表)。 后續補充 ... |