Chrome 自动把 http 的 xhr 请求替换成了 https 域名
问题描述
遇到了个诡异的事情。客户反馈他们想在线上 https 域名下,就是要访问 http 的链接,但是失败了。发出去的一直是 https 的 xhr 请求。
直接在控制台输入例子代码,就能看到 network 里发出去的链接的确是 https 的
var xhr = new XMLHttpRequest()
xhr.open("GET", "http://imapi.jiehun.com.cn/socket.io/1/?t=1668076877422", true)
xhr.send()
已知 XMLHttpRequest 对象控制台输出的的确是 native code,并不是被篡改了的,何解?
解答
参考 MDN 文档 HTTP Strict Transport Security
HTTP-Strict-Transport-Security(通常简称为 HSTS)响应标头用来通知浏览器应该只通过 HTTPS 访问该站点,并且以后使用 HTTP 访问该站点的所有尝试都应自动转换为 HTTPS。
语法
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
检查得知客户的网站的确是设置了这个
查阅了下
max-age=
. 设置在浏览器收到这个请求后的 秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
includeSubDomains. 可选. 如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
preload. 可选. 查看 预加载 HSTS 获得详情。不是标准的一部分。
故而这个用户设置现在和未来的所有子域名会自动使用 HTTPS 连接长达一年。同时阻止了只能通过 HTTP 访问的内容。且启用了预加载服务。
preload 与预加载
谷歌维护着一个 HSTS 预加载服务。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。
- Chrome & Chromium 的 HSTS 预加载列表: https://www.chromium.org/hsts
- Firefox 的 HSTS 预加载列表:nsSTSPreloadList.inc