现象:访问某个域名及任意一个子域名都会强制跳转HTTPS,即使将该域名解析至任意一个站点都会被强制跳转
原因:不恰当设置了HSTS 导致
什么是 HSTS ?
HSTS是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写。 这是一种网站用来声明他们只能使用安全连接(HTTPS)访问的方法。 如果一个网站声明了 HSTS 策略,浏览器必须拒绝所有的 HTTP 连接并阻止用户接受不安全的 SSL 证书。 目前大多数主流浏览器都支持 HSTS。
为什么开启后反而影响到了访问?
开启HSTS本身是为了更安全,但是开启前务必确保所有资源必须都必须支持通过HTTPS访问(使用正确有效且被信任的证书)
如何判断一个站点是否开启了HSTS ?
通常在初次请求站点后,站点会在响应的header中增加
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
这意味着站点开启了HSTS,includeSubDomains 和 preload都是可选参数;
includeSubDomains 意味着该域名的所有子域名都将启用HSTS,所以子域名也必须支持HTTPS,不然就是会遇到无法访问(证书不匹配过期均会导致无法访问且浏览器不允许忽略)
preload 预加载列表。简单是将域名加入到浏览器内置的一个列表中,该列表由chrome维护,随浏览器版本更新,这意味着加入会需要相当长时间,而一旦加入只能 等下次浏览器版本更新才能移除
所以要将自己的域名加入列表必须确保能够在较长时间内保持对所有资源的完全 HTTPS 访问
如何判断是否已加入预加载列表
https://hstspreload.org/ 登录此网站查询域名是否已在预加载列表内
若还未加入,在调试网站时因为HSTS原因导致出现非预期跳转,需要清理缓存,此时清理浏览器缓存无效,需要清理HSTS缓存 ,浏览器地址里访问下面地址
chrome://net-internals/#hsts
Edge浏览器也是一样的方法,在 Delete domain security policies下的文本框中输入要删除的域,然后点击Delete
如果域名已进入了预加载列表,这个删除是不生效的。
如何从预加载列表中移除
可以访问https://hstspreload.org/removal/
输入域名进行提交,注意在提交前必须移除了preload参数(页面有移除的前提条件)
这里提交后并不能立即移除,要等下个浏览器版本更新