谷歌浏览器 Chrome 的 https 强制跳转HSTS 307 Internal Redirect
date
May 30, 2024
slug
hstsir
status
Published
tags
Web
summary
type
Post
背景
某项目的测试环境是 http,生产环境是 https,两个环境使用同一个域名和路径🤣,直到某天在chrome 下,http 会自动切换到 https,这时测试环境肯定出问题了。
具体现象是,前端通过 http 去请求接口或访问页面,然后服务器返回状态码
307 Internal Redirect
和HSTS
字样,接着自动发起 https 请求。分析
1、技术分析(摘自 chatGPT)
HSTS (HTTP Strict Transport Security) 307 Internal Redirect 是一种浏览器内部的重定向,用于强制将 HTTP 请求转换为 HTTPS 请求。这种重定向并不是由服务器返回的,而是由浏览器自身处理的,以下是其工作原理及原因:
原理
- 首次访问:当用户首次访问一个支持 HSTS 的网站时,网站会通过响应头部(
Strict-Transport-Security
)通知浏览器该网站需要使用 HTTPS 连接。
- HSTS 规则存储:浏览器收到
Strict-Transport-Security
头部后,会将该规则存储一段时间(例如,max-age=31536000 表示 1 年)。
- 后续访问:在存储期限内,当用户再次尝试以 HTTP 访问该网站时,浏览器会自动将请求转换为 HTTPS 请求,而不会发送 HTTP 请求到服务器。这种自动转换就是 HSTS 307 Internal Redirect。
原因
HSTS 307 Internal Redirect 出现的原因主要有以下几个:
- 安全性:HSTS 旨在提高网站的安全性,防止中间人攻击和降级攻击。通过强制使用 HTTPS,可以确保通信的加密和完整性。
- 用户体验:自动重定向可以减少用户的手动操作,提高访问速度和体验。
- 避免混合内容:HSTS 可以帮助防止在 HTTPS 页面上加载非安全的 HTTP 内容,从而避免混合内容问题。
- 浏览器缓存:浏览器会缓存 HSTS 规则,并在有效期内自动应用,这意味着只要规则有效,浏览器就会对所有 HTTP 请求进行内部重定向。
可能的情况
- 用户第一次访问网站时,服务器返回了包含
Strict-Transport-Security
头部的响应,之后的访问就会触发 307 Internal Redirect。
- 用户可能在浏览器中清除了缓存或 HSTS 规则到期后重新访问,才会重新加载 HSTS 规则。
解决方法
通常不需要解决 HSTS 307 Internal Redirect,因为这是正常的安全机制。但如果在开发或调试时需要临时禁用 HSTS,可以:
- 清除浏览器缓存:在浏览器设置中清除缓存和网站数据。
- 使用无痕模式:在无痕模式下,HSTS 规则不会被持久存储。
- 浏览器开发者工具:有些浏览器允许在开发者工具中禁用 HSTS 规则。
服务器本身无法直接禁用 HSTS,因为 HSTS 是一种由浏览器执行的安全策略。然而,服务器可以通过配置来控制是否向浏览器发送 HSTS 头部,以及可以控制 HSTS 头部的相关参数。如果你希望从服务器端禁用 HSTS,主要的做法是确保服务器不发送
Strict-Transport-Security
头部。总之,HSTS 307 Internal Redirect 是一种浏览器的安全机制,用于确保访问 HTTPS 站点的安全性。
2、问题定位
经测试在某几个页面才会出现这种情况,同时了解到chrome 打开
chrome://net-internals/#hsts
,输入域名如 www.baidu.com
可查询到chrome 本地记录改域名的 HSTS 策略,也支持手动添加和删除。
经过页面点击和chrome 的
Query HSTS/PKP domain
结合分析,发现某个页面中从浏览器请求 https 的图片后,本地会记录该域名的 HSTS 信息。解决
在数据库将 https 图片地址改为 http 后不再复现307 的问题,同时本地不记录该域名的 HSTS 信息。
思考
平时我们可能也注意到,chrome 下访问 http 时,会自动跳转 https,这时笔者一般是换浏览器,少部分情况下清缓存。现在回想起这个现象,肯定就和 HSTS 有关系了。
那么为了避免这个问题传染给用户,所以尽量使用全站 HTTPS 最好,刚好这也符合主流的安全策略,和浏览器的安全引导。