【发布时间】:2020-11-18 07:49:53
【问题描述】:
我在 Safari 的 CORS 系统中遇到了一些奇怪的行为。 我有一个从 JS Fetch API 发送的 POST 请求,如下所示:
const res = await fetch('http://localhost:8888/myPath', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
});
根据 Safari 的网络监视器,请求头是这样的:
POST /myPath HTTP/1.1
Accept: */*
Content-Type: application/json
Origin: http://my.domain.com
Content-Length: 335
Accept-Language: en-gb
Host: localhost:8888
User-Agent: Mozilla/5.0...
Referer: http://my.domain.com
Accept-Encoding: gzip, deflate
Connection: keep-alive
以下响应来自服务器:
HTTP/1.1 200 OK
Date: Tue, 28 Jul 2020 19:15:45 GMT
Vary: Origin
Content-Length: 4
Content-Type: application/json
Access-Control-Allow-Origin: http://my.domain.com
Server: uvicorn
很遗憾,我的这台机器上没有 Wireshark,而且 Safari 也没有显示预检请求。所以我不知道是否发生了预检以及情况如何。
现在的问题是:当我有一个新的浏览器会话(例如使用私有模式)并访问我的触发获取请求的文档时,一切正常。 只有在重新加载页面以再次发送 CORS 请求后,我才会在 Safari 控制台中收到“由于访问控制检查而无法加载 Fetch API”。 所以我想,这与 Safari 如何缓存 CORS 请求/预检有关。
在 Firefox 和 Chrome 中,我的 CORS 请求非常有效。
我该如何解决这个问题?
【问题讨论】:
-
我也有同样的问题。我无法确定这是 Safari 缓存错误,还是可以通过服务器上的 CORSrule 修复的问题。仅当 Safari 对 缓存的 资源进行预检 CORS 检查时才会发生这种情况,这一事实让我认为它是 Safari。
-
除了终止正斜杠的建议外,这篇文章还建议在所有支持 CORS 的响应中添加以下标头:Vary: Origin, Access-Control-Request-Headers, Access-Control-请求方法stackoverflow.com/questions/44800431/…
-
问题可能是由于这个“错误”/对标准的无知吗? bugs.webkit.org/show_bug.cgi?id=171934