浏览器请求后台接口报错如下
Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
后台 nginx 配置了 strict-transport-security 参数 查看日志未收到前端请求 前端清楚缓存后再次请求又成功了,过会就会又失败 定位到问题是请求接口是 https 的但是接口请求的是 http
但是对于出现这种情况的原因还是不太清楚。
这是知乎上边的一篇讲解。
1
awanganddong OP 当用户已经安全的登录开启过 htst 功能的网站 (支持 hsts 功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持 htst 的浏览器(比如 chrome. firefox)会自动将这个域名加入到 HSTS 列表,下次即使用户使用 http 访问这个网站,支持 htst 功能的浏览器就会自动发送 https 请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的 Strict-Transport-Security,就会把域名加入到 hsts 缓存中,然后才会在发送请求前将 http 内部转换成 https ),而不是先发送 http,然后重定向到 https,这样就能避免中途的 302 重定向 URL 被篡改。进一步提高通信的安全性。
|
2
awanganddong OP 我这样理解不知道对不对
1.用户首次 http 请求,首先发 option 预检请求(走 http ),通过之后正式 post 请求(走 http)。 这时候 strict-transport-security 会把域名加入 hsts 缓存中。 2.第二次请求,预检请求(走 http ),通过之后正式请求(走 hsts 缓存)。跨域失败。 |
3
no1xsyzy 2021-02-20 12:14:46 +08:00
一旦 HSTS 就不要想着 HTTP,根本没有 “接口请求的是 http” 一说,都是 HTTPS,一旦在 HSTS 期限内,永远不可能发出 HTTP,发出来请直接报 security bug 给对应浏览器。( localhost 除外)
不知道你为什么会 3xx,OPTIONS 似乎不允许 3xx |
4
markgor 2021-02-20 12:36:55 +08:00
如 3L 所言,
1 、HSTS 开启后,时间范围内走的都是 HTTPS 。 2 、ajax 跨域流程: 浏览器判断 ajax 是否跨域, 发送 option 请求到 ajax 请求的 url 返回 header 包含允许跨域信息再次发送 ajax 请求。 你现在的问题应该是说 ajax 首次访问的是 http 的 url 地址, 导致 option 访问的也是 http 地址。 既然是跨域,前端为何不直接写死请求地址为 https 呢? |
5
awanganddong OP 就是我后台提供的接口是 https 的{http 也可以用},但是前端请求我接口用的是 http,然后就报错了。
我现在对报错这个环节不太理解。 |
6
beastk 2021-02-20 17:49:29 +08:00 via iPhone
hsts 无法降级
|