Safari 中的 CORS 错误,而不是 Chrome

Posted

技术标签:

【中文标题】Safari 中的 CORS 错误,而不是 Chrome【英文标题】:CORS error in Safari, not in Chrome 【发布时间】:2018-08-24 13:44:21 【问题描述】:

我正在构建一个文件上传器, 在前端使用Vue Dropzone, 和后端的自定义 php

我的前端脚本正在发送带有以下标头的请求:

请求标头 POST /jobimport HTTP/1.1 主机:myurl 连接:保持活动 内容长度:765309 来源:http://localhost:8080 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.162 Safari/537.36 内容类型:multipart/form-data;边界=---- WebKitFormBoundaryhaaAoTz2J5iipi3M 接受:应用程序/json 缓存控制:无缓存 X-Requested-With: XMLHttpRequest 推荐人:http://localhost:8080/import 接受编码:gzip、deflate、br 接受语言:en-US,en;q=0.9,nl;q=0.8,de;q=0.7,fr;q=0.6

在后端的 .htaccess 文件中,我添加了以下几行:

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers "*"

使用 Chrome 时,文件上传没有问题。 在查看请求标头时,我什至看到以下内容:

响应标头 (...) 访问控制允许标头:* 访问控制允许来源:* (...)

但是,当使用 Safari 时,上传失败,并且出现以下错误:

加载资源失败:Access-Control-Allow-Headers 不允许请求标头字段 Cache-Control。 XMLHttpRequest 无法加载 https://myurl。 Access-Control-Allow-Headers 不允许请求头域 Cache-Control。

我不明白这在 Chrome 中是如何工作的,但在 Safari 中却不是。

【问题讨论】:

我猜这是因为 Chrome 支持在 Access-Control-Allow-Headers 中使用 * 来表示“任何标题名称”,而 Safari 不支持。因此,要使其在 Safari 中运行,您需要明确列出您希望允许的每个标头名称 - 例如,Cache-Control @sideshowbarker 是正确的。将* 用于Access-Control-Allow-HeadersAccess-Control-Allow-Methods 的功能是最近才出现的,尚未在所有浏览器中实现。 【参考方案1】:

@sideshowbarker 和 @roryhewitt 的 cmets 是正确的, Safari 确实不支持将通配符 * 用于 Access-Control-Allow-Headers。 我明确列出了所有标题而不是使用通配符,现在它可以完美运行了。

【讨论】:

【参考方案2】:

如果父域 URL 在 https 中,您必须在 https 中调用 ajax URL。如果没有,请不要使用 https。希望这会有所帮助

【讨论】:

以上是关于Safari 中的 CORS 错误,而不是 Chrome的主要内容,如果未能解决你的问题,请参考以下文章

仅在 iOS 移动 Safari 中上传图像时出现错误的 CORS 失败

由于浏览器设置的标头,Safari 拒绝重定向 CORS 请求

“脚本错误。” window.onerror 中的错误仅在 Safari 中

Firefox 在 CORS 资源上失败,而 Chrome 和 Safari 工作

.net 核心允许在使用 CORS 时发回错误 401(而不是零)

当我根据 DynDNS url 名称而不是 IP 发出 axios 请求时,为啥会出现 CORS 错误?