来自 S3 Origin 的 Cloudfront 响应不断更改 CORS 标头
Posted
技术标签:
【中文标题】来自 S3 Origin 的 Cloudfront 响应不断更改 CORS 标头【英文标题】:Response from Cloudfront from S3 Origin keeps changing CORS Headers 【发布时间】:2018-09-04 19:23:35 【问题描述】:这是我的问题: CORS 设置为应该在 S3 上:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
当我尝试获取文件时(使用带有选项 CrossDomain = true 的 jQuery)
来自 A.example.com -> B.example.com/file.js(使用正确的标题) 当我尝试来自另一个域的相同请求时: C.dev.example.com -> B.example.com/file.js //(失败)
但是对于第二个示例,当我查看 chrome 中的网络日志时 我的第一个请求OPTIONS:
它具有正确的 CORS 响应标头:
access-control-allow-headers: access-control-allow-headers
access-control-allow-methods: GET
access-control-allow-origin: *
access-control-max-age: 3000
content-length: 0
date: Mon, 26 Mar 2018 14:38:36 GMT
server: AmazonS3
status: 200
vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
via: 1.1 f19281f08e79aa6c6634266c50732dd5.cloudfront.net (CloudFront)
x-amz-cf-id: S2aMKSsJspB9p2RVxLMNh49iQ3Rc0Uims-EEIcjbxC42_OpqJpoUXQ==
x-cache: Miss from cloudfront
但是 GET 请求(就在 OPTIONS 之后):
accept-ranges: bytes
content-length: 817
content-type: application/javascript
date: Mon, 26 Mar 2018 14:19:46 GMT
etag: "5b85d498318db8095a776fdcae57c624"
last-modified: Mon, 26 Mar 2018 14:19:20 GMT
server: AmazonS3
status: 200
via: 1.1 f19281f08e79aa6c6634266c50732dd5.cloudfront.net (CloudFront)
x-amz-cf-id: C0xswS08mXDHkagm3phQT59wjclwEX9ZZHXr57OpZVMHzkf432H7dg==
x-cache: RefreshHit from cloudfront
我在 Cloudfront 上的 TTL 是 5 秒(对于我的用例来说它必须是激进的) 我使用的是 h2 协议而不是 http/1.1
【问题讨论】:
您是否遵循了这些步骤? docs.aws.amazon.com/AmazonS3/latest/user-guide/… @Hackerman :我阅读了所有文档,我的问题(显然)对于第一个请求,浏览器没有发送“Origin”标头,所以我得到的响应没有 CORS 标头。之后,似乎响应在没有这些标头的情况下被缓存...当我擦除云端缓存时,我按照应有的方式执行请求(C.dev -> 文件),我有正确的标头。 您能否同时为每个调用添加Request
和Response
标头?
@Hackerman 也检查一下:serverfault.com/questions/856904/…
【参考方案1】:
我的问题是由于与 CloudFront 未在响应中发送“Vary: Origin”标头这一事实相关的已知问题,因此响应被触发错误的浏览器缓存。
更多细节在这里:https://forums.aws.amazon.com/thread.jspa?threadID=156134 以及更多详细信息:https://serverfault.com/questions/856904/chrome-s3-cloudfront-no-access-control-allow-origin-header-on-initial-xhr-req/856948#856948
【讨论】:
从技术上讲,问题是当请求是非 CORS 请求时,S3 不会返回Vary: Origin
标头。 CloudFront 返回(并缓存)S3 提供的内容,浏览器也将其缓存,从而使浏览器错误地断定缓存的响应可以重复使用。请注意,您的 date
标头表明浏览器正在重用对 GET
请求的响应,该响应是在 OPTIONS
请求之前发出的。
@Michael-sqlbot 谢谢!您可以将此标记为 serverfault 中问题的重复项吗?
我愿意,但不能将发布在一个 SE 网站上的问题标记为与其他 SE 网站上的问题重复。以上是关于来自 S3 Origin 的 Cloudfront 响应不断更改 CORS 标头的主要内容,如果未能解决你的问题,请参考以下文章
Video.js - HLS => 没有“Access-Control-Allow-Origin”标头 [S3,CloudFront]
Cloudfront 的 Terraform:InvalidHeadersForS3Origin,但我没有将 [*] 传递给任何 S3 源
Chrome S3 Cloudfront:初始和加载请求上没有“Access-Control-Allow-Origin”标头