当前位置: 首页 > news >正文

HTTPS -> HTTP 引起的 307 状态码与HSTS

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 响应头示例:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

307 状态码与 HSTS 的冲突

若网站启用了 HSTS 但服务器返回 307 重定向到 HTTP,浏览器会根据 HSTS 策略拒绝重定向并终止连接。此时可能出现以下情况:

  • 控制台报错:浏览器显示 HTTP Strict Transport Security 拦截警告。
  • 用户无法访问:页面加载失败,尤其当 HSTS 包含 includeSubDomainspreload 时。

解决方案

避免 HTTPS 到 HTTP 的重定向

  • 检查服务器配置(如 Nginx、Apache),确保所有重定向目标使用 HTTPS。
  • 更新后端代码逻辑,避免手动构造 HTTP 链接。

合理配置 HSTS

  • 设置较长的 max-age(如 1 年)并逐步增加。
  • 测试无误后添加 includeSubDomainspreload 指令。
  • 通过 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 + RCmd + 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

后续补充

...

http://www.dtcms.com/a/359753.html

相关文章:

  • ans.1中的对象标识符OBJECT_IDENTIFIER----OID
  • 【开题答辩全过程】以 基于springboot的垃圾分类管理系统为例,包含答辩的问题和答案
  • 力扣热题100:合并区间详解(Java实现)(56)
  • 历史数据分析——寒武纪
  • Android开发-活动页面
  • 20.28 《4bit量化模型预处理揭秘:如何节省75%显存高效微调LLM?》
  • leetcode-hot-100(堆)
  • 金融学-货币理论
  • Kafka应用过程中的高频问题
  • 【Linux基础】深入理解计算机存储:GPT分区表详解
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:BC136 KiKi判断上三角矩阵及BC139 矩阵交换题目的解析
  • uvm验证环境中struct(结构体)和class的区别与联系
  • 使用AdaLoRA 自适应权重矩阵微调大模型介绍篇
  • 接口测试总结-含接口测试和前端测试的区别与比较
  • PyTorch 张量(Tensor)详解:从基础到实战
  • 1.9 初始Memory Profiler Package
  • 面试 八股文 经典题目 - HTTPS部分(一)
  • Qt组件布局的经验
  • 深度学习数据加载实战:从 PyTorch Dataset 到食品图像分类全流程解析
  • 实现需求精准预测、运输路径优化及库存高效管理的智慧物流开源了
  • 利用 Java 爬虫获取淘宝拍立淘 API 接口数据的实战指南
  • 图片格式转换v2_tif转png tif转jpg png转tif
  • mysql深度分页
  • JVM的四大组件是什么?
  • 【贪心算法】day5
  • 暄桐林曦老师关于静坐常见问题的QA
  • 矩阵待办ios app Tech Support
  • 好用的电脑软件、工具推荐和记录
  • Labview使用modbus或S7与PLC通信
  • 微服务01