hsts 强制跳转 https

记录开发过程中遇到的一次测试环境被强制跳转 https 的问题.

问题

背景:项目开发时有两套环境, 一个是线上 https://api.demo.example.com, 另一个是测试环境 http://test-api.demo.example.com.

某次访问无https的测试环境时,显示无响应 ERR_CONNECTION_RESET. 仔细一看,网址被跳转到了https://test-api.demo.example.com. 由于测试环境并未配置https,所以无法访问.

原因

那么为什么访问测试环境的网址会被强制跳转到 https 呢? 同时其他使用chrome的测试人员有的也会有这种问题,有的却不会跳转。

通过多次测试对比发现, 只有当访问过生产环境后才会出现测试环境被强制跳转的情况.

同时通过网上搜过强制跳转 https 机制, 发现是一个叫 HSTS 的东西在起作用。

HSTS

HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能, 它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP.

其实就是一个 http response header, 语法格式如下:

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=<expire-time>
设置在浏览器收到这个请求后的<expire-time>秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。

includeSubDomains 可选
如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。

preload 可选
查看 预加载 HSTS 获得详情。不是标准的一部分。

查看测试环境的请求, 并未发现有 HSTS Header. 网上搜索发现可以去 chrome://net-internals/#hsts 查询跳转详情,发现确实有强制跳转.

然后突然意识到会不会是线上环境的强制跳转影响的, 于是去查看线上环境的请求, 果然发现了 HSTS Header:
strict-transport-security: max-age=15724800; includeSubDomains

image.png

而且, 其中包含了 includeSubDomains.

这样就解释了为何访问过生产环境的才会出现测试环境也强制跳转的问题: 因为测试环境被设置在生产环境的子域名下.

解决办法

原因找到了, 那么解决办法就有了,有以下几种方法可以使用:

都配置https

给不同的环境都配置https, 也就无所谓是否强制跳转了.

或者不要混用子域名

用不同的子域名

例如
生产环境用: https://api.demo.example.com
测试环境用: http://api.test-demo.example.com

用完全不同的域名

或者干脆用不同的域名, 这样也能防止一些 Cookie 信息混用

注意有些域名会被chrome强制跳转https
Chrome 于 V63 版本起会将 .dev 域名强制转换为 HTTPS

可选的域名有:

.test
.local

然后在 /etc/hosts 绑定ip到相应的测试域名地址即可.


lxz
眼睛瞪得像铜铃
217 声望
3 粉丝
0 条评论
推荐阅读
「彻底弄懂」this全面解析
当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在 哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的其中一个属性,会在 函数执行的过程中用到...

wuwhs17阅读 2.1k

封面图
ChatGPT for SegmentFault 插件发布!
ChatGPT for SegmentFault 是一个浏览器插件,帮助你在思否社区查看 ChatGPT 针对每个问题的回答,在你等待人工回答的同时,快速获取到 AI 提供的回答。社区用户间相互帮助会产生更多交流,答案中通常包含一些自...

SegmentFault思否13阅读 2k评论 4

封面图
图解浏览器的多进程渲染机制
观察浏览器的任务管理器可以发现,打开浏览器的一个页面需要多个进程,包括浏览器进程、GPU 进程、网络进程、渲染进程等,有插件的话还会包括各种插件进程(Chrome 选项 -&gt; 更多工具 -&gt; 任务管理器)。

兰俊秋雨6阅读 1.1k

CSS 高阶小技巧 - 角向渐变的妙用!
本文将介绍一个角向渐变的一个非常有意思的小技巧!我们尝试使用 CSS 绘制如下图形:在之前,类似的图案,其实我们有尝试过,在 单标签实现复杂的棋盘布局 一文中,我们用单标签实现了这样一个棋盘布局:那么,本...

chokcoco7阅读 472

学会了slidev.js的开发者, 也许可以考虑不用ppt了?
&ensp;&ensp;&ensp; 作为一个开发者, 每次使用PPT或者Word写简历或者述职都好痛苦啊, 这些App也不太适合展示代码, 但是今天来的家人们有福了, 一款叫做是slidev的库露出了邪魅的微笑 官网地址。

lulu_up7阅读 762

编写属于自己的音乐播放器
因为以上两个问题,这就导致我们需要对原生的audio进行修改时比较困难。而对于大多数音频的需求,我们可以使用满足我们要求的第三方组件库中选择,如:

九旬7阅读 689评论 1

浏览器截图方案分析
浏览器截图方案分析页面截屏是前端经常遇到的需求,比如页面生成海报,弹窗图片分享等。以下是我整理三种截图方案:html2canvasdom-to-imagewebRTChtml2canvashtml2canvas 用的比较广泛的前端截图方案,先将 DOM ...

九旬6阅读 533

217 声望
3 粉丝
宣传栏