跨域发送 PUT 请求的时候,浏览器会发送一个 OPTIONS 请求作为 preflight 请求。
然而请求的时候浏览器却报错:
Access to XMLHttpRequest at 'http://example.com/api/v3/app/1' from origin 'http://example.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
字面意思就是 CORS 请求不允许重定向。但问题是我这链接并没有重定向呀?
打开开发者工具 Network 一看,服务器返回 Status Code: 307 Internal Redirect
, 有个 header: Non-Authoritative-Reason: HSTS
,redirect 的地址恰好是对应 HTTPS 的地址。
心想是不是 Nginx 开启 HSTS 造成的,但检查了一下,并没有开启 HSTS,而且通过请求工具测试发出 OPTIONS 请求,返回的也是204 No Content
, 但是在浏览器里请求还是 307.
试过清理浏览器缓存,一开始正常了,也是返回204 No Content
,但是过几天后,又是出现307 Internal Redirect
然而今天通过抓包工具 Charles 抓取了一下,发现 Chrome 并没有真正发出这个 OPTIONS 请求,怀疑是直接读取了缓存。
那么这到底是哪来的缓存导致的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.