【问题标题】:AWS CloudFront CORS SupportAWS CloudFront CORS 支持
【发布时间】:2015-06-16 14:28:56
【问题描述】:

我正在尝试构建一个应用程序,用户可以在其中通过 CloudFront 将浏览器上的内容上传到 S3 存储桶。我在 S3 存储桶上启用了 CORS,并确保 AllowedOrigin 设置为 *.我可以成功地将内容从浏览器直接推送到 S3 存储桶,因此我知道 S3 上的 CORS 配置正确。现在,我正在尝试对浏览器 -> CloudFront -> S3 做同样的事情。 CloudFront 始终以 403 禁止响应拒绝飞行前 OPTIONS 方法请求。

我在 CloudFront 上启用了以下选项:

  • 允许的 HTTP 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
  • 白名单标头:访问控制请求标头,
  • Access-Control-Request-Method、Origin OPTIONS 请求被禁用 来自“缓存的 HTTP 方法”

CloudFront 显然现在支持 CORS,但有人让它适用于 HTTP 方法 OPTIONS 请求吗?我试过在AWS forums 上问这个问题,但没有任何回应。

【问题讨论】:

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


    【解决方案1】:

    您是否尝试为您的云端域添加 CNAME 别名??

    设置好 CNAME 别名后,您可以在基域上设置 cookie,然后您就可以传递您的 cookie。

    如果人们想知道下一步是什么,让我们更详细地介绍它,让我们使用以下示例:-

    1. 您正在 my.fancy.site.mydomain.com 上进行开发
    2. 您的 Cloudfront CNAME 别名是 content.mydomain.com
    3. 确保从您的精美应用中将您的云端签名 cookie 设置为 .mydomain.com
    4. 从此时起,您可以为 CF 传递 cookie。
    5. 一种快速测试您的 cookie 是否设置正确的方法,尝试获取您的资产 URL,然后将 URL 直接放在浏览器中。如果 cookie 设置正确,您将能够直接访问该文件。

    如果您使用 javascript 获取 cdn 资产,请确保在您的 JS 代码中,您需要传递 withCredentials 选项,否则它将不起作用。例如,如果您使用 jQuery,您将需要以下内容:-

    $.ajax({
       url: a_cross_domain_url,
       xhrFields: {
           withCredentials: true
       }
    });
    

    如果请求成功,您应该从 CloudFront 获得带有“Access-Control-blah-blah”的响应标头。

    希望对搜索此答案的人们有所帮助。

    【讨论】:

    • 感谢您的回答,但我认为这不会有帮助。正如我在问题中所说,我可以直接从签名的 S3 URL 成功检索文件,所以我认为这不是身份验证问题(即 cookie 或签名的 URL)。问题是当 CloudFront 位于中间并且浏览器执行 CORS OPTION 请求时,CloudFront 总是拒绝它。
    【解决方案2】:

    我发现了一个非常相似的问题。 CloudFront 分配未将标头信息发送到 S3。您可以通过以下方式轻松测试:

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

    如果你有同样的问题,可以在这里查看我的解决方案:

    AWS S3 + CloudFront gives CORS errors when serving images from browser cache

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 2019-05-16
      • 1970-01-01
      • 2019-04-24
      • 2020-02-01
      • 2018-05-18
      • 2017-12-11
      • 2014-06-16
      • 2014-01-15
      相关资源
      最近更新 更多