我无法强迫S3在从桶返回的所有对象上设置CORS头,虽然启用了CORS,因为客户端S3上传工作正常,返回的对象没有CORS头!
我启用的政策是:
<?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>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
示例对象网址https://s3.amazonaws.com/captionable/meme/test
有谁知道出了什么问题?
答案 0 :(得分:35)
首先,确保每个请求都有一个Origin
标头。如果没有发送Origin
标头,S3将不会发送access-control
标头,因为S3认为它们无关(通常,它们是)。浏览器(意味着CORS机制)将在通过XMLHTTPRequest执行跨源HTTP请求时自动发送Origin
标头。
如果使用img
加载图片,则需要添加crossorigin="anonymous"
属性。看到
MDN Documentation on crossorigin attribute。这将导致浏览器发送Origin
请求标头,就像使用XMLHTTPRequest一样。
根据Sam Selikoff的回答,您可能需要更改
<AllowedOrigin>http://*</AllowedOrigin>
到
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
我没有测试过这个。
Paul Draper对此答案的评论:注意缓存问题。浏览器可能会使用不包含相应Access-Control
响应标头的缓存响应。在开发过程中,您可以清除缓存。在生产中,如果资源之前以静态方式使用,则必须切换到资源的新URL。
答案 1 :(得分:27)
我还使用<image>
标记遇到此问题,在按照Myrne Stol的回答后,我将crossorigin=anonymous
标记添加到了我的图片代码中。我确认Origin
标头确实已发送到S3,但仍然没有发送Access-Control-Allow-Origin
标头作为响应。
我遇到this SO answer并解决了它。我将S3配置中的AllowedOrigin
更改为:
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
现在S3使用访问标头进行响应。耶!
答案 2 :(得分:1)