CORS 请求在 Safari 中不起作用

IT技术 javascript safari xmlhttprequest cors
2021-01-27 02:03:43

我正在提出 CORS xhr 请求。这在 chrome 中运行良好,但是当我在 safari 中运行时,我收到“无法加载 ---- Access-control-allow-origin 不允许访问”。代码完全相同,我已经在服务器上设置了 CORS。下面是我的代码。(有访问控制,但你可以在没有 accessToken 的情况下自由尝试)

 var water;
 var req = new XMLHttpRequest;
 req.overrideMimeType("application/json");
 req.open('GET', 'https://storage.googleapis.com/fflog/135172watersupplies_json', true);
 req.setRequestHeader('Authorization', 'Bearer ' + accessToken);
 origThis = this;
 var target = this;
 req.onload = function() {
 water = req;

 req.send(null);

查看请求标头后,我看到首先发出 OPTIONS 请求,这是不允许的请求。原始标头不包含在 Safari 的响应中,但包含在 chrome 中。什么会导致这个。任何帮助将不胜感激。

更新:我已经在 Safari for Windows 中尝试过并且它可以工作,所以我不确定这里发生了什么。我使用的 mac 是远程访问 (Macincloud.com),但我认为这与它无关。

6个回答

我在针对 Amazon S3 中的文件发出 XHR 请求时遇到了同样的错误。在 Safari 7 上它失败了。我知道您没有使用 Amazon S3,但我想我会发布以防此解决方案对其他人有所帮助。

问题是 Safari 7 将 Access-Control-Request-Headers 标头设置为“origin, x-requested-with”,但我的 AWS CORS 配置只允许“x-requested-with”:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>x-requested-with</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

我添加了“来源”作为允许的标题,一切正常。

        <AllowedHeader>origin</AllowedHeader>

注意:AllowedOrigin*仅用于开发目的。有关更多信息,请参阅下面的@andes 评论。

如果仍然有人遇到问题,我正在使用什么修复程序origin(小写),因为我有Origin
2021-03-16 02:03:43
如果您遵循此示例,请注意对 AllowedOrigin 使用 * 确实适用于开发环境 - 对于大多数用例,您应该在生产中使用白名单。下面是一个实现白名单的例子:github.com/monsur/CORSinAction/blob/master/ch07/listing-7.1/...
2021-03-22 02:03:43

我刚刚遇到了类似的问题,CORS 错误。它适用于 Firefox 和 Chrome,但不适用于 Safari 10。

结果我们需要在 JSON URL 上加上斜杠。

什么 JSON URL 的尾部斜杠是什么?失败的 XHR 请求?一些 Allowed-origin 标头?请详细说明。
2021-03-18 02:03:43
谢谢!这对我有用。没有反斜杠,Safari 上的 CORS 错误,在 FF 和 Chrome 中很好。带反斜杠,在 Safari、FF 和 Chrome 上很好!
2021-03-29 02:03:43
有没有搞错?这对我也有用。谢谢,但 Safari 有什么问题?
2021-04-10 02:03:43

至于 Amazon S3,它仅在我添加了更多允许的标头、Content-Type 和 Range 后才能在 safari 中工作。其中之一完成了这项工作。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>Origin</AllowedHeader>
        <AllowedHeader>X-Requested-With</AllowedHeader>
        <AllowedHeader>Content-Type</AllowedHeader>
        <AllowedHeader>Range</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

就我而言,这是 Accept-Language 标头的问题。我已经Accept-Language在里面添加Access-Control-Allow-Headers并解决了。

设置两个响应头:

  1. 访问控制允许方法:'*',允许所有

  2. 原来服务器的 Access-Control-Allow-Methods 响应标头的值设置为 *。它必须明确设置为允许方法而不是通配符,因为它不受 iOS 中的 safari 支持,如本 MDN 文档中所述。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods