Amazon S3 CORS 仍然无法正常工作:没有“访问控制允许来源”

Posted

技术标签:

【中文标题】Amazon S3 CORS 仍然无法正常工作:没有“访问控制允许来源”【英文标题】:Amazon S3 CORS still not working: No 'Access-Control-Allow-Origin' 【发布时间】:2017-05-13 06:11:46 【问题描述】:

在尝试从 Amazon S3 服务器加载图像(跨域设置为匿名)时,我们仍然遇到可怕的错误:

 XMLHttpRequest cannot load 
 http://resource-url No 
'Access-Control-Allow-Origin' header is present on the requested resource. Origin
'http://server-url' is therefore not allowed access.

我们尝试了几种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>

以及亚马逊的默认 CORS 配置。仍然,同样的错误。

其他几点说明:

Chrome 中存在此问题,但 Firefox 中没有。 图像正在作为 AFrame 资产加载(因此是 XMLHttpRequest) curl -XGET -H 'Origin: anonymous' http://resource-url 返回看起来是图像的内容,以 ?PNG 开头 对于 Chrome,here are the headers。 Here is the response。 对于 Firefox,here are the headers。响应是图像。 Here 是 CORS 上的 AFrame 文档。但是,由于图像是从 S3 获取并在 Github 页面上提供它们并不是一个真正的选择,因此它可能没有用处。

我无能为力,所以任何帮助都将不胜感激。非常感谢!

【问题讨论】:

Upon trying to load an image (with crossorigin set to anonymous) - 你能显示这个代码吗,错误信息表明你使用的是XMLHttpRequest 而不是“加载图像” 您能否检查请求标头是否包含 Origin 标头 - 我已经读过,如果没有 Origin 标头,Amazon S3 服务器将不会使用任何 CORS 标头进行响应 ref XMLHttpRequest is sending a CORS header - 不知道你的意思是什么,我从来没有说过 XMLHttpRequest 需要发送 CORS 标头 ... CORS 标头由客户端接收,而不是发送 I meant a CORS header being included in the request 再次,CORS 标头在 response ...使用浏览器开发人员工具的网络选项卡 ...检查请求/响应标头是否有失败的请求。 .. 具体来说(我可以在文档中找到所有内容)检查 request 标头是否包含 Origin 标头 - 没有这个,Amazon S3 将不会使用 CORS response 标头响应(正如我之前提到的) This issue is present in Chrome but not Firefox - 忽略我所说的一切。它适用于任何浏览器的事实意味着服务器端是正确的,而客户端至少在 Firefox 中是正确的......我很惊讶 Chrome 与 Firefox 之间存在差异......获取资源的页面是http:// 也是? (例如不是https:// 【参考方案1】:

可能添加&lt;AllowedMethod&gt;HEAD&lt;/AllowedMethod&gt;:

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

似乎有一些现代浏览器使用HEAD 方法发送的飞行前检查(用于服务器负载检查)。更多阅读here和here。

【讨论】:

谢谢。我到处都在搜索有关症状的参考资料,而您在这里所说的是根本原因。 :) 很高兴这对您有所帮助,祝您一切顺利@bfeist 我不知道这是否解决了它,或者只是使 CloudFront 无效的副作用。我正在查看网络跟踪,它是一个 GET 请求并且没有获取标头,但它现在正在工作,所以我赞成 :) 再想一想,也许 CloudFront 在提供缓存副本之前发送了 HEAD 请求?我只知道浏览器在 GET 上失败了。【参考方案2】:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

添加上述xml代码后,需要使缓存失效。

【讨论】:

以上是关于Amazon S3 CORS 仍然无法正常工作:没有“访问控制允许来源”的主要内容,如果未能解决你的问题,请参考以下文章

amazon s3 deleteObjects nodejs - 无法正常工作

s3-amazon 图像 CORS 问题(仅在 5-8 小时后发生在少数浏览器中)

Amazon S3 CORS 错误

Amazon S3 CORS 适用于 HTTP,但不适用于 HTTPS

Amazon S3 CORS(跨域资源共享)和 Firefox 跨域字体加载

Amazon S3 + CloudFront CORS 问题