17

我正在尝试让 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 配置。)

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

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

4

3 回答 3

3

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

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

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

于 2013-02-24T08:52:42.030 回答
2

2014 年 6 月 26 日,AWS在 CloudFront 上发布了正确的 Vary: Origin 行为,因此我在这个问题上添加了一些说明,以反映我们如何正确设置它。

于 2014-06-27T19:46:16.667 回答
0

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

于 2013-04-16T23:04:27.037 回答