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 列表)。 后续补充 ... |