
在企业级应用集成场景中,会出现Http协议和Https都要支持的问题,也会遇到一些跨域问题,一般我们会配置一些Access Control请求头的配置,本周遇到了一个由 HTTP 严格传输安全(HSTS)机制引发的跨域访问问题。一开始排查这个问题以为是普通的跨域问题,没有深入思考,以为对应的前端应用升级为Https就可以解决了,是的,确实可以解决问题,但这是问题的真因吗?
前端应用通过 HTTP 协议发起请求,调用链路为:前端 → API 网关 → 后端服务。问题发生的完整流程:
1. 用户之前访问通过网关代理访问后端服务的 HTTPS 接口
↓
2. 浏览器缓存了 Strict-Transport-Security 策略
↓
3. 前端应用通过 HTTP 协议调用接口
↓
4. 浏览器检测到 HSTS 缓存,自动升级为 HTTPS
↓
5. 请求协议变化:http://domain.com → https://domain.com
↓
6. Origin 发生变化,触发浏览器同源策略检查
↓
7. 跨域错误:CORS policy blocked在这个过程中,后端服务的接口返回了 Strict-Transport-Security 响应头,导致浏览器强制将原本的 HTTP 请求升级为 HTTPS 请求(307 内部重定向),触发了浏览器的跨域安全策略限制,导致接口调用失败。错误表现:

Strict-Transport-Security(简称 HSTS)是一种 Web 安全策略机制,其主要作用是强制客户端(如浏览器)使用 HTTPS 与服务器建立连接。响应头格式:
Strict-Transport-Security: max-age=31536000; includeSubDomains首次访问(建立策略)
浏览器 → HTTPS 请求 → 服务器
服务器 → 返回响应头:Strict-Transport-Security: max-age=31536000
浏览器 → 记录策略:该域名在 1 年内必须使用 HTTPS
后续访问(强制升级)
用户输入:http://example.com
浏览器检查:发现有 HSTS 策略缓存
浏览器行为:自动将 HTTP 升级为 HTTPS(307 Internal Redirect)
实际请求:https://example.comStrict-Transport-Security 响应头导致浏览器自动将 HTTP 请求升级为 HTTPS,引发协议不一致,触发跨域安全策略。临时方案:网关层移除响应头,快速止损。根本方案:后端调整配置或全链路升级 HTTPS。
HSTS 是一种安全机制,但在一些场景中需要谨慎使用,协议不一致会导致跨域问题,需要保持全链路协议统一。长期目标是全链路 HTTPS,提升整体安全性。
最近会时常梦见已故的祖辈和亲人,这大概是年龄增长带来的感触。每个小孩都会有“藏在罐子里的爱”,包括我。北京的月很圆,老家的土地和院子里的人沐浴着同样的月光,只是一层薄薄的土,人与人就再难相见了。