允许AJAX从Amazon S3的GET? (访问控制允许来源)(Allow AJAX GETs

2019-06-26 00:36发布

我存储在Amazon S3中JSON对象,我想从S3直接从JavaScript加载数据。 我GET看起来很普通:

$.ajax({
    'type':'GET',
    'url':'http://s3.amazonaws.com/mybucketname/'+id,
    'dataType':'text',
    'success':function(msg) {
        alert(msg);
    }
});

我得到以下错误:

XMLHttpRequest cannot load http://s3.amazonaws.com/whatever/whatever. Origin http://mylocalhostname:9000 is not allowed by Access-Control-Allow-Origin.

我可以使用curl得到S3该网址,或直接从我的浏览器导航到那里。 难道我真的要我自己的服务器有代理所有这些要求的?

Answer 1:

S3现在支持使用CORS文件跨域请求。

您可以在这里找到更多信息:

http://docs.amazonwebservices.com/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors

和:

http://aws.typepad.com/aws/2012/08/amazon-s3-cross-origin-resource-sharing.html



Answer 2:

S3不发送“访问控制允许来源”,如果你使用通配符*头,如:

<AllowedOrigin>*</AllowedOrigin>

要强制S3发送AllowedOrigin头,但还是让你的内容从任何网站下载,使用此:

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>


Answer 3:

搜索了很多 - 这是样品溶液:

http://blog.bignerdranch.com/1670-upload-directly-to-amazon-s3-with-support-for-cors/

(添加区权限选项卡上CORS)

<?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>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>


Answer 4:

我们也有类似的问题,但不是用GET但presigned S3 POST。 我认为这可能是有人在Google上搜寻这个问题有帮助。

在某些浏览器Dropzone.js LIB无法上传图片直接S3桶(presigned S3 POST)。 怪异的一部分是,这是在某些计算机上发生的所有的时间和一些一出二十尝试。

在一台计算机,我们设法捕捉在Firefox中调试程序错误(网络选项卡)

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://s3-eu-west-1.amazonaws.com/pobble.com-browser-uploads-production. (Reason: CORS header 'Access-Control-Allow-Origin' missing).

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://s3-eu-west-1.amazonaws.com/pobble.com-browser-uploads-production. (Reason: CORS request failed).

更新S3桶CORS这对我们的工作:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://www.myapp.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>Accept-Ranges</ExposeHeader>
        <ExposeHeader>Content-Range</ExposeHeader>
        <ExposeHeader>Content-Encoding</ExposeHeader>
        <ExposeHeader>Content-Length</ExposeHeader>
        <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>https://www.app.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>Accept-Ranges</ExposeHeader>
        <ExposeHeader>Content-Range</ExposeHeader>
        <ExposeHeader>Content-Encoding</ExposeHeader>
        <ExposeHeader>Content-Length</ExposeHeader>
        <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
    </CORSRule>
</CORSConfiguration>

重要的部分是<ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>由于这种S3被暴露响应头OPTIONSPOST

协同工作@阿纳斯-阿拉维 , @joserose &@equivalent



Answer 5:

您可以使用一个JSONP请求而不是JSON。 下面是详细信息。 http://api.jquery.com/jQuery.ajax/



Answer 6:

我是用同一种问题的挣扎。 唯一的区别是我想从我的S3拉阿贾克斯一个文件,并将其加载到一个站点。

很多搜索之后我最终加入这个选项我的Ajax请求。

xhrFields:{withCredentials:真正},

工作就像一个魅力,只要你有CORSConfiguration允许所有。

希望能帮助到你。



Answer 7:

您可能希望增加MAX AGE的配置,如果你有这将需要更长的时间来下载较大的文件,也可能会提前切断。 托管等媒体都需要这个。 我对通配符访问(任何域)配置为10000秒以内,这应该是安全长于有人需要,甚至下载一个坏的连接上我的文件:

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


Answer 8:

这是我从提示: https://github.com/mozilla/pdf.js/issues/3150

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>Accept-Ranges</ExposeHeader>
        <ExposeHeader>Content-Range</ExposeHeader>
        <ExposeHeader>Content-Encoding</ExposeHeader>
        <ExposeHeader>Content-Length</ExposeHeader>
    </CORSRule>
</CORSConfiguration>


Answer 9:

对于任何人这个问题苦苦挣扎,因为别人说你必须强制S3通过添加这些行到你的CORS配置与CORS头回应:

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>

但你后必须清除浏览器缓存文件上所请求的资源的旧头被存储。 在Chrome中,找到清除浏览数据选项,然后选择清除文件缓存。 硬重装不会清除某些文件。 如果你喜欢只清除文件缓存只对当前网站, 这样的回答解释了如何做到这一点。

这对我来说是疑难杂症。



文章来源: Allow AJAX GETs from Amazon S3? (Access-Control-Allow-Origin)