Amazon S3 CORS 标头仅在 OPTIONS(预检)期间显示,而不在 GET 请求期间显示
Posted
技术标签:
【中文标题】Amazon S3 CORS 标头仅在 OPTIONS(预检)期间显示,而不在 GET 请求期间显示【英文标题】:Amazon S3 CORS headers only show during OPTIONS (preflight) and not during GET request 【发布时间】:2013-10-30 14:39:53 【问题描述】:我有一个具有以下 CORS 配置的 S3 存储桶。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
预检检查按预期工作。
★ ~$ curl -i -X OPTIONS -H "Origin: http://***.com" -H "Access-Control-Request-Method: GET" https://s3.amazonaws.com/random-stuff-ohyea/coderot.gif
HTTP/1.1 200 OK
x-amz-id-2: H6tzMUCJtYgiCRrhj5DucMhjjYtj1kKWqL7u2yaRGEorOeKhu/sTKlgGqY7uHxQC
x-amz-request-id: E784C4373565CBE6
Date: Mon, 21 Oct 2013 22:14:18 GMT
Access-Control-Allow-Origin: http://***.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Content-Length: 0
Server: AmazonS3
但是 GET 请求的原始标头没有。
★ ~$ curl -iI -H "Origin: http://***.com" https://s3.amazonaws.com/random-stuff-ohyea/coderot.gif
HTTP/1.1 200 OK
x-amz-id-2: KlrSviRSwq/40zPwOGp2/lJZk0J2Fyu7kOg966osOvQ2mpbpiv5BLkihGSOfoLd8
x-amz-request-id: 9D051B0001F48AB7
Date: Mon, 21 Oct 2013 22:11:57 GMT
Last-Modified: Mon, 21 Oct 2013 22:10:53 GMT
ETag: "4fa16333380378e116479646b40dd1ee"
Accept-Ranges: bytes
Content-Type: image/gif
Content-Length: 1774246
Server: AmazonS3
这很重要,因为 Firefox 在加载我的 s3 存储桶中的远程字体时似乎没有进行预检。它似乎只发送原始标头。
【问题讨论】:
进一步调试表明,如果我在 get 请求中包含“Access-Control-Request-Method: GET”标头,我会得到正确的 CORS 标头,但 firefox 不会这样做。跨度> 默认情况下,非花哨的 GET 请求不执行预检检查。 W3 Spec, MDN 【参考方案1】:使用 curl -iI 选项,您将执行 HEAD 请求而不是 GET 请求。所以你不会得到 CORS 标头。为了简化测试,将 <AllowedMethod>HEAD</AllowedMethod>
添加到您的 CORS 配置中,您将获得预期的结果。
【讨论】:
以上是关于Amazon S3 CORS 标头仅在 OPTIONS(预检)期间显示,而不在 GET 请求期间显示的主要内容,如果未能解决你的问题,请参考以下文章
Amazon S3 + CloudFront CORS 问题
被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头
Amazon S3 CORS 适用于 HTTP,但不适用于 HTTPS
我们如何为 Amazon S3 存储桶中的文件夹设置 CORS