Amazon s3 S3不返回访问控制允许源标题?

Amazon s3 S3不返回访问控制允许源标题?,amazon-s3,cors,Amazon S3,Cors,我很难强制S3在它从bucket返回的所有对象上设置CORS头,尽管启用了CORS,但由于客户端S3上传正在工作,返回的对象没有CORS头 我启用的策略是: <?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*&

我很难强制S3在它从bucket返回的所有对象上设置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>


有人知道哪里出了问题吗?

首先,确保每个请求都有一个
Origin
头。如果未发送
Origin
报头,S3将不会发送
access control
报头,因为S3认为这些报头不相关(通常是不相关的)。当通过XMLHTTPRequest执行跨源HTTP请求时,浏览器(CORS机制的意思是)将自动发送一个
Origin

如果使用
img
加载图像,则需要添加
crossorigin=“anonymous”
属性。看见 . 这将导致浏览器发送一个
Origin
请求头,就像对待XMLHTTPRequest一样

根据Sam Selikoff的回答,你可能需要改变

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

http://*
https://*
我还没有测试过这个


根据Paul Draper对这个答案的评论:当心缓存问题。浏览器可能会使用未包含适当的
访问控制
响应头的缓存响应。在开发过程中,您可以清除缓存。在生产中,如果资源以前是以静态方式使用的,则必须切换到该资源的新URL。

我还遇到了一个
标记,在遵循Myrne Stol的回答后,我将
crossorigin=anonymous
标记添加到我的图像标记中。我验证了
Origin
头确实被发送到了S3,但是仍然没有响应发送
accesscontrolalloworigin

我偶然发现它,它解决了它。我将S3配置中的
AllowedOrigin
更改为:

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

现在S3用访问头进行响应。耶

TLDR;确保请求(某处)需要CORS的资源的每个图像或视频元素都使用
crossorigin=“anonymous”

我遇到了一个导出到画布的视频元素的问题。CORS在S3中设置正确,但它仍然给我一个错误,并拒绝播放视频


原来还有第二个视频元素指向同一个资源,而该视频元素没有
crossorigin=“anonymous”
。因此,第二个视频播放良好,因为它不需要
访问控制
头,但服务器响应被缓存并阻止第一个视频播放,因为缓存的服务器响应没有
访问控制头
Chrome有一个惊人的错误,他们不会修复:

如果您有幸能够控制生成标记的代码,您可以将
crossorigin=“anonymous”
添加到标记中。

如果可以修改标记的URL或XHR请求的URL,则可以向其中一个添加查询参数以绕过缓存。
比如
foo.bar/baz.jpg?x-request=xhr


顺便说一句,Safari也有这个问题。

这就是问题所在。我正在创建一个图像标记,它不发送源标题。也就是说,我希望S3总是返回CORS头,尽管它只有在指定了“Origin”时才会返回。感谢您确认CORS配置正确。我对该属性没有任何经验。将其设置为“匿名”可能会触发浏览器发送
Origin
标题。也许可以单独提问?另外,请求必须是GET而不是HEAD。用curl来测试这个问题:
curl-iH“Origin:test”http://……
这个答案基本上是正确的,但肯定不是无关紧要的。如果没有CORS的响应被缓存,下一个请求将检索到一个没有CORS的响应并失败。添加
*GET 3000 Authorization
对我有效。但这只有在我打开开发者控制台和GoToNetworks选项卡并检查“禁用缓存”时才起作用。如果不打开开发人员控制台,则无法工作。@cory dolphin我认为这应该是公认的答案。我对图像标签也有同样的问题,加上这两行就解决了。这对我不起作用(~2年后)。我已经更改了配置,我正在Postman中测试这两个版本&使用标签。在这两种情况下,S3都不响应CORS头。我做错了什么,或者S3已经改变了吗?您还必须在任何请求中包含一个Origin头-这让我使用curl(例如,
curl-xget-v--header“Origin:https://www.example.com" https://s3-eu-west-1.amazonaws.com/my-bucket/asset.ext
)NGL几个小时以来,我一直在努力寻找一个解释,这一点应该更上一层楼,因为这是我遇到问题的真正原因——我从来没有想到拥有一个(或者在我的例子中,甚至是css中的背景图像)会改变后来使用的JS代码的行为。你是救世主。
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>