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 标准的一部分,也不该被当作正式的内容。

posted @ 2022-11-10 19:06  Ever-Lose  阅读(546)  评论(0编辑  收藏  举报