1.应用场景
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 主要用于了解HSTS, 以及如何合理设置, 如正式服和测试服, 开发环境; 摘要:当HTTPS网站返回307状态码临时重定向到HTTP时,会带来安全风险(如中间人攻击和混合内容问题)。 HSTS机制通过强制HTTPS通信可解决此问题,但若与307重定向冲突会导致连接中断。 建议检查服务器配置,避免HTTPS到HTTP的重定向,并合理设置HSTS参数(如max-age和preload)。 调试时可使用Chrome DevTools和SSL测试工具,Nginx示例配置展示了如何强制HTTPS和启用HSTS。 |
2.学习/操作
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ## 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 响应头示例: http 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 配置 nginx 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
列表)。 后续补充 ... |
3.问题/补充
|-----|
| TBD |
后续补充
...