从浏览器缓存提供图像时,AWS S3 + CloudFront会出现CORS错误

时间:2015-11-22 17:51:30

标签: amazon-web-services amazon-s3 cors amazon-cloudfront

如果我清除了浏览器缓存,那么只需从支持Cloudfront的S3存储桶中找到所有内容。但是,当我关闭缓存时,我在控制台中收到错误:

来自原始图片[ORIGIN网址]已被跨源资源共享政策阻止加载:否' Access-Control-Allow-Origin'标头出现在请求的资源上。因此,不允许原点[我的本地地址]访问。

MY 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>

我也回顾了这个建议并更改了cloundfront发行版设置。它似乎已经起作用了,但现在绝对不能使用浏览器缓存: CORS problems with Amazon S3 on the latest Chomium and Google Canary

我也试过把&#34; Header添加Access-Control-Allow-Origin&#34; *&#34;&#34;在我的网站.htaccess。没运气。注意:我的网站是从localhost托管和访问的(它是一个开发环境)。

2 个答案:

答案 0 :(得分:11)

我发现自己遇到了同样的问题:没有Access-Control-Allow-Origin出现。这是非常随机的,有时它是有效的,有时它没有。我终于以这种方式缩小了它:

  1. 启用了S3网站托管
  2. 在S3和CloudFront中测试了CORS标头
  3. 以下是如何轻松测试CORS标头:

    SELECT ID, Datum AS DateField, Assets
    FROM dbTable
    GROUP BY Datum, ID, Assets
    HAVING Datum >= DateAdd("yyyy", -1, DateValue(Forms!YourForm!txtDatum))
    ORDER BY Datum DESC;
    

    在我的情况下,它在S3中可以正常工作,但在CloudFront中,它只会有时返回访问控制标题:

    curl -i -H "Origin: http://YOUR-SITE-URL" http://S3-or-CLOUDFRONT-URL | grep Access
    

    经过更多研究后,我发现我们的CloudFront分配已配置为阻止标题进入S3。解决这个问题:

    1. 转到AWS仪表板中的CloudFront分配
    2. 点击分发设置
    3. 单击“行为”选项卡
    4. 编辑默认模式行为
    5. 点击Forward Headers并选择Whiteelist
    6. 添加3个建议的标题:Access-Control-Request-Headers,Access-Control-Request-Method,Origin
    7. 保存更改
    8. 一旦标题进入S3,我们总能通过上面的 curl 命令看到正确的访问控制信息。

答案 1 :(得分:2)

我遇到了同样的问题,发现如下所示暴露标题可以解决问题:

<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>MYIP</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>