来自S3源的Cloudfront响应不断更改CORS头信息。

3

这是我的问题: CORS应该在S3上设置:

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

当我尝试通过jQuery使用CrossDomain = true选项获取文件时,从A.example.com -> B.example.com/file.js(正确的Headers可行)。但是,当我从另一个域C.dev.example.com -> B.example.com/file.js进行同样的请求时,它失败了。然而,在第二个示例中,当我查看Chrome中的网络日志时,我的第一个请求OPTIONS:具有正确的CORS响应标头。请注意保留HTML标记。
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


你按照这些步骤操作了吗?https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-cors-configuration.html - Hackerman
@Hackerman:我已经阅读了所有的文档,我的问题(显然)是浏览器在第一次请求时没有发送“Origin”头,因此我得到了没有CORS头的响应。之后似乎响应被缓存而没有这些头...当我清除cloudfront缓存,并按照预期的方式进行请求(C.dev->文件),我就有了正确的头。 - M. Gara
您能否在每个调用中同时添加请求(Request)响应(Response)头部? - Hackerman
@Hackerman,请查看以下内容:https://serverfault.com/questions/856904/chrome-s3-cloudfront-no-access-control-allow-origin-header-on-initial-xhr-req/856948#856948 - M. Gara
1个回答

2

2
从技术上讲,问题在于当请求不是CORS请求时,S3不返回“Vary: Origin”头。CloudFront返回(并缓存)S3提供的内容,浏览器也会缓存它,导致浏览器错误地得出缓存响应可以被重用的结论。请注意,您的“date”标头表明浏览器正在重用先前进行的“GET”请求的响应,而不是“OPTIONS”请求。 - Michael - sqlbot
@Michael-sqlbot 谢谢!你能在 serverfault 上将这个标记为重复问题吗? - M. Gara
我想这样做,但是在一个SE网站上发布的问题不能被标记为不同SE网站上的问题的副本。 - Michael - sqlbot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接