我存储在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被暴露响应头OPTIONS
和POST
协同工作@阿纳斯-阿拉维 , @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)