http 跨域的问题(hsts)

2021-02-20 09:43:57 +08:00
 awanganddong

浏览器请求后台接口报错如下

Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

后台 nginx 配置了 strict-transport-security 参数 查看日志未收到前端请求 前端清楚缓存后再次请求又成功了,过会就会又失败 定位到问题是请求接口是 https 的但是接口请求的是 http

但是对于出现这种情况的原因还是不太清楚。

这是知乎上边的一篇讲解。

https://zhuanlan.zhihu.com/p/245511588

1820 次点击
所在节点    程序员
6 条回复
awanganddong
2021-02-20 09:45:49 +08:00
当用户已经安全的登录开启过 htst 功能的网站 (支持 hsts 功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持 htst 的浏览器(比如 chrome. firefox)会自动将这个域名加入到 HSTS 列表,下次即使用户使用 http 访问这个网站,支持 htst 功能的浏览器就会自动发送 https 请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的 Strict-Transport-Security,就会把域名加入到 hsts 缓存中,然后才会在发送请求前将 http 内部转换成 https ),而不是先发送 http,然后重定向到 https,这样就能避免中途的 302 重定向 URL 被篡改。进一步提高通信的安全性。
awanganddong
2021-02-20 09:52:49 +08:00
我这样理解不知道对不对

1.用户首次 http 请求,首先发 option 预检请求(走 http ),通过之后正式 post 请求(走 http)。 这时候 strict-transport-security 会把域名加入 hsts 缓存中。
2.第二次请求,预检请求(走 http ),通过之后正式请求(走 hsts 缓存)。跨域失败。
no1xsyzy
2021-02-20 12:14:46 +08:00
一旦 HSTS 就不要想着 HTTP,根本没有 “接口请求的是 http” 一说,都是 HTTPS,一旦在 HSTS 期限内,永远不可能发出 HTTP,发出来请直接报 security bug 给对应浏览器。( localhost 除外)

不知道你为什么会 3xx,OPTIONS 似乎不允许 3xx
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 呢?
awanganddong
2021-02-20 13:19:23 +08:00
就是我后台提供的接口是 https 的{http 也可以用},但是前端请求我接口用的是 http,然后就报错了。

我现在对报错这个环节不太理解。
beastk
2021-02-20 17:49:29 +08:00
hsts 无法降级

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/754468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX