【问题标题】:Why is CloudFront varying CORS headers response based on Accept-Encoding?为什么 CloudFront 会根据 Accept-Encoding 改变 CORS 标头响应?
【发布时间】:2013-01-17 23:39:20
【问题描述】:

我正在尝试让 CORS 与 Amazon S3 + CloudFront 一起正常工作。

设置我的 CORS 配置后,它似乎工作正常:

$ curl -H "Origin: https://app.close.io" -I "https://d4389n07pf8cq.cloudfront.net/built/app.9e1f9ee9.js" -s | grep Access  
Access-Control-Allow-Origin: https://app.close.io
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true

但是当使用Accept-Encoding: gzip 请求资源时,CORS 标头不会正确返回。

$ curl -H "Origin: https://app.close.io" -H "Accept-Encoding: gzip" -I "https://d4389n07pf8cq.cloudfront.net/built/app.9e1f9ee9.js" -s | grep Access 
(nothing)

这是为什么呢?

我的 CORS 配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>https://app.close.io</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>Content-*</AllowedHeader>
        <AllowedHeader>Host</AllowedHeader>
        <AllowedHeader>Accept-Encoding</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

(我还尝试了删除 Accent-Encoding 标头的 CORS 配置。)

S3 对象本身已压缩,并具有Content-Encoding: gzipCache-Control: public, max-age=31536000Content-Type: application/javascript 的“元数据”。

我不明白为什么 CloudFront+S3 CORS 在请求 gzip 时无法正常工作。

【问题讨论】:

  • 或许这篇文章对你来说会很有趣:3 Problems AWS Needs to Address.
  • Alex:那是在 2012 年 5 月写的,然后他们在 2012 年 8 月发布了 CORS - aws.typepad.com/aws/2012/08/…
  • 你最近有什么改变吗?我刚刚尝试了你的 curl 请求,它工作正常,返回了标题。如果你没有改变任何东西,也许亚马逊修复了一个错误。
  • 这就是奇怪的地方。前几天我回到这里,它在那个 URL 上也对我有用。然后我尝试了 .js 文件的更新版本(我编辑了要显示的问题)- .js 的更新版本不起作用!但现在那个也对我有用。所以在它开始工作之前有一些(很长的)延迟......
  • 根据:forums.aws.amazon.com/… forums.aws.amazon.com/… forums.aws.amazon.com/message.jspa?messageID=447737#447737 2013 年 4 月,他们开始在 S3 响应标头中添加 Vary: Origin,这意味着此问题已修复一半,但仍在等待 Cloudfront 正确支持实际修复的 Vary 标头。

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


【解决方案1】:

我认为您遇到的问题是由于 CloudFront 缺乏对 CORS 的本机支持造成的。目前他们不支持对 Origin 标头进行 Vary,因此 CloudFront 可能会为您的第二个请求提供一个旧的缓存响应,该响应没有正确的 CORS 标头(接受编码:gzip)。

查看 AWS 论坛上的此主题,了解缺少 CORS 支持的解决方法:

https://forums.aws.amazon.com/message.jspa?messageID=422504#422532

【讨论】:

  • sweet!,我碰到了this demo,也解释了同样的事情:)
【解决方案2】:

这可能对您有所帮助,因为我已成功让 CORS 在 S3 和 Cloudfront 上工作。我注意到 S3 和 Cloudfront 第一次提取文件时,它们几乎会缓存标头,即使在您更改它们之后也是如此。确保启用了“查询参数”版本控制,您可以将?v=1 添加到文件末尾。这为我们“更新”了标题,CORS 一切都很好。

【讨论】:

    【解决方案3】:

    AWS 于 2014 年 6 月 26 日发布了 proper Vary: Origin behavior on CloudFront,因此我添加了一些 instructions on this question,以反映我们如何正确设置它。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2014-04-17
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2011-12-20
      • 2012-09-26
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多