Javascript CORS请求不在Safari中工作

Javascript CORS请求不在Safari中工作,javascript,safari,xmlhttprequest,cors,Javascript,Safari,Xmlhttprequest,Cors,我正在提出CORS xhr请求。这在chrome中工作得很好,但是当我在safari中运行时,我得到了一个“不能加载----访问控制不允许访问允许源”。代码完全相同,我已经在服务器上设置了CORS。下面是我的代码。(具有访问控制,但您可以在不使用accessToken的情况下自由尝试) 在查看请求头之后,我看到首先发出了一个选项请求,这是不允许的请求。原始标头不包括在Safari中的响应中,但在chrome中。这是什么原因造成的。任何帮助都将不胜感激 更新: 我在Safari for Windo

我正在提出CORS xhr请求。这在chrome中工作得很好,但是当我在safari中运行时,我得到了一个“不能加载----访问控制不允许访问允许源”。代码完全相同,我已经在服务器上设置了CORS。下面是我的代码。(具有访问控制,但您可以在不使用accessToken的情况下自由尝试)

在查看请求头之后,我看到首先发出了一个选项请求,这是不允许的请求。原始标头不包括在Safari中的响应中,但在chrome中。这是什么原因造成的。任何帮助都将不胜感激

更新:
我在Safari for Windows中试用过,效果很好,所以我不确定这里发生了什么。我使用的mac是远程访问(Macincloud.com),但我认为这与此无关。

对于CORS请求,您应该使用您的origin
fflog.storage.googleapis.com
。如果您使用common
storage.googleapis.com
origin,任何站点都可以访问您的bucket

是否尝试删除
覆盖emimetype
?如果设置mime类型,它将正确返回

我对Safari POST请求也有问题,但还没有答复。得到是好的

当我尝试时

curl-v-X选项\
-H'来源:fflog.storage.googleapis.com'\
-H'访问控制请求方法:GET'\
https://storage.googleapis.com/fflog/135172watersupplies_json
在其他标题中,我得到:

Access-Control-Allow-Origin: *
当我对
https://storage.googleapis.com/fflog/135172watersupplies_json
在Mac OS 10.8.3上的Safari 6.0.4中,我收到403个错误,但它们都会执行


因此,我只能猜测您正在尝试发送一个不允许使用通配符
访问控制允许源代码的文件。

尝试删除overide mimetype

 var
 jsonhandler=function(){var req=JSON.parse(this.response);console.log(req)},
 req=new XMLHttpRequest;
 req.open('GET','https://storage.googleapis.com/fflog/135172watersupplies_json');
 req.setRequestHeader('Authorization','Bearer '+accessToken);
 req.onload=jsonhandler;
 req.send();

当我查询您的URL时,我得到以下信息:

我怀疑这与你的访问控制头有关——要么你遗漏了什么,要么太具体了

鉴于您实际发送的是自定义标头,您可能希望尝试:

Access-Control-Allow-Headers: *
您还可以看到省略
访问控制公开头是否会有所不同


除此之外,查看实际的请求/响应头将非常有帮助。

感谢所有的响应,我自己终于得到了这些。我将“Origin”添加到我的响应负责人中,现在工作正常。

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

问题是Safari 7将访问控制请求标头设置为“origin,x-Request-with”,但我的AWS CORS配置只允许“x-Request-with”:


*
得到
3000
授权
x-with
我添加了“origin”作为允许的标题,一切正常

        <AllowedHeader>origin</AllowedHeader>
原点

注:
*
的允许来源仅用于开发目的。更多信息,请参见下面的@andes评论。

我刚刚遇到了一个类似的问题,CORS错误。它可以在Firefox和Chrome中使用,但不能在Safari 10中使用


事实证明,我们需要在JSON URL上添加尾随斜杠。

至于AmazonS3,在我添加了更多允许的标题、内容类型和范围之后,它才在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>

*
得到
邮递
3000
授权
起源
X-With
内容类型
范围

我遇到了同样的问题,CORS在Chrome中工作,但在Safari中抛出了一个原点错误。结果证明这是一个Kerberos授权问题。当我直接在Safari中加载XHR URL时,系统会提示我输入凭据。输入后,我返回到原始站点,Safari不再有CORS错误。

在我的情况下,这是Accept Language标头的问题。我在
Access Control Allow头文件中添加了
Accept Language
,问题得到了解决

我们在
Cloudfront
(由s3 bucket支持)上遇到了完全相同的问题,这里给出的解决方案没有帮助。问题在于Cloudfront剪辑了一些标题。这为我们解决了这个问题:


将其放在此处,以防将来有人遇到此解决方案。

设置两个响应标题:

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

  • 结果表明,服务器的访问控制允许方法响应头的值设置为*。它必须显式设置为允许使用方法,而不是通配符,因为iOS中的safari不支持它,如本MDN文档中所示


  • 我不确定是否还有其他人会遇到此问题,但我请求了一个URL,如:

    https://api.website.com/api/v1/users/auth0|5ef7502019360a7/

    URL中的
    |
    (管道)字符导致Safari出现奇怪的问题,因为URL编码不正确

    在我的Javascript中,我只是替换了我的旧url:

    consturl=”https://api.website.com/api/v1/user/auth0|5ef27593603a7”

    consturl=”https://api.website.com/api/v1/user/auth0|5ef27593603a7”。替换(“|”和“%7C”)

    %7C
    |
    (管道)字符的正确URL编码


    希望这对别人有帮助

    我试过了,但没有成功…也试过了另一个url,但没有成功:/谢谢你的帖子。但要真正使用cURL测试CORS,您需要设置origin头来模拟浏览器环境。Access-Control-Allow-Headers不允许通配符,它必须是完全匹配的-如果您遵循此示例,请注意,使用*for AllowedOrigin实际上是针对开发环境的-您应该在生产中使用白名单,对于大多数用例。这里有一个例子
    <?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>
    
    <?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>