为什么CloudFront会根据Accept-Encoding改变CORS标头响应?

时间:2013-02-02 21:59:19

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

我正在努力让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对象本身是gzip压缩文件,其“元数据”为Content-Encoding: gzipCache-Control: public, max-age=31536000Content-Type: application/javascript

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

3 个答案:

答案 0 :(得分:3)

我认为您遇到的问题是由于CloudFront缺乏对CORS的原生支持。此时它们不支持Origin头上的Vary,因此CloudFront可能会传递一个旧的缓存响应,该响应没有为您的第二个请求提供正确的CORS头(使用接受编码:gzip)。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这可能对您有所帮助,因为我已成功获得CORS以在S3和Cloudfront上工作。我注意到第一次S3和Cloudfront拉文件时他们几乎缓存了标题,即使你已经更改了它们。确保启用了“查询参数”版本控制,并且可以将?v=1添加到文件末尾。这个“更新”了我们和CORS的标题都很好。