12

最近我启用了 Amazon S3 + CloudFront 作为我的 rails 应用程序的 CDN。为了使用字体资源并在 Firefox 或 IE 中显示它们,我必须在我的 S3 存储桶上启用 CORS。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

然后我用curl -I https://small-read-staging-assets.s3.amazonaws.com/staging/assets/settings_settings-312b7230872a71a534812e770ec299bb.js.gz了,我得到了:

HTTP/1.1 200 OK
x-amz-id-2: Ovs0D578kzW1J72ej0duCi17lnw+wZryGeTw722V2XOteXOC4RoThU8t+NcXksCb
x-amz-request-id: 52E934392E32679A
Date: Tue, 04 Jun 2013 02:34:50 GMT
Cache-Control: public, max-age=31557600
Content-Encoding: gzip
Expires: Wed, 04 Jun 2014 08:16:26 GMT
Last-Modified: Tue, 04 Jun 2013 02:16:26 GMT
ETag: "723791e0c993b691c442970e9718d001"
Accept-Ranges: bytes
Content-Type: text/javascript
Content-Length: 39140
Server: AmazonS3

我应该在哪里看'Access-Control-Allow-Origin'一些吗?S3 是否需要时间来更新 CORS 设置?如果缓存它们,我可以强制过期标头吗?

4

4 回答 4

8

尝试发送 Origin 标头:

$ curl -v -H "Origin: http://example.com" -X GET https://small-read-staging-assets.s3.amazonaws.com/staging/assets/settings_settings-312b7230872a71a534812e770ec299bb.js.gz > /dev/null

然后输出应显示您正在寻找的 CORS 响应标头:

< Access-Control-Allow-Origin: http://example.com
< Access-Control-Allow-Methods: GET
< Access-Control-Allow-Credentials: true
< Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method

可以在此处找到有关如何使用 cURL 调试 CORS 请求的其他信息: 如何使用 cURL 调试 CORS 请求?

请注意,有不同类型的 CORS 请求(简单和预检),可以在此处找到有关差异的很好的教程:http: //www.html5rocks.com/en/tutorials/cors/

希望这可以帮助!

于 2013-07-30T19:32:06.343 回答
3

试试这些:

  1. 尝试缩小您要允许访问的域名的范围。S3 不喜欢*
  2. CloudFront + S3 无法正确处理开箱即用的 CORS 配置。一个组合是附加一个包含引用域名称的查询字符串,并在您的 CloudFront 分配设置中明确启用对查询字符串的支持。
于 2013-08-03T05:08:47.527 回答
3

要回答标题中的实际问题:

不,S3 似乎不需要任何时间来传播 CORS 设置。(截至 2019 年)

但是,如果您使用的是 Chrome(可能还有其他),那么 CORS 设置可能会被浏览器缓存,因此如果您只是进行普通的浏览器刷新,您不一定会看到预期的更改。而是右键单击刷新按钮并选择“Empty Cache and Hard Reload”(从 Chrome 73 开始)。然后,新的 CORS 设置将在 AWS 控制台中进行更改后的 <~5 秒内生效。(它可能比这快得多。尚未测试。)这适用于普通的 S3 存储桶。我不知道 CloudFront 如何影响事物。

(我意识到这个问题已有 6 年历史,可能涉及其他人早已回答的其他技术问题,但是当您搜索 CORS 更改的传播时间这个简单问题时,这个问题是最先出现的问题,所以我认为它应该得到一个解决这个问题的答案。)

于 2019-04-18T18:48:27.397 回答
1

您测试 CORS 的方式存在一些问题。

  1. 您的 CORS 配置没有 HEAD 方法。
  2. 您的 curl 命令没有 -H 标头。

我可以通过使用 curl 来获取您的数据,如下所示。然而,他们在我的屏幕上倾倒了垃圾,因为您的数据是压缩的二进制文件。

curl --request GET  https://small-read-staging-assets.s3.amazonaws.com/staging/assets/settings_settings-312b7230872a71a534812e770ec299bb.js.gz -H "http://google.com"
于 2013-08-13T21:25:08.473 回答