亚马逊 S3 + CloudFront 跨域资源共享问题

10
我们正在使用Amazon S3 + CloudFront来提供JSON文件。我们上传了两个文件,假设为j1.json和j2.json。这两个文件最初在响应中都有有效的CORS头,但是当对j2.json进行无效化时,其头响应发生了变化,我们面临CORS问题。
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>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

j1.json的响应头

enter image description here

j2.json的响应头 enter image description here

两个JSON文件在同一个存储桶中,但是j2.json的响应头缺失这些信息。

Access-Control-Allow-Methods →GET
Access-Control-Allow-Origin →*
Access-Control-Max-Age →3000

我们尝试删除并重新上传对象,但响应中没有回应CORS头。这个问题可能的原因是什么?如何解决?


清除浏览器缓存并尝试在其他浏览器中打开。当出现这种情况时,最有可能的解释是文件的旧缓存副本。 - sideshowbarker
@sideshowbarker 我们已经尝试了不同的浏览器,清除缓存和硬刷新。Postman也是一样的。到目前为止还没有运气。 - RockStar
3
CloudFront分发是否配置为将“Access-Control-Request-Headers”、“Access-Control-Request-Method”和“Origin”标头转发到S3(在“缓存行为”中)?在使用Postman进行测试时,您是否发送了“Origin:”标头(以及其他标头)?能否展示URL? - Michael - sqlbot
@Michael-sqlbot 谢谢,CloudFront分发转发头解决了这个问题。请提交为答案,我会点赞并标记为已解决。 - RockStar
2个回答

38

在 S3 返回正确的 CORS 响应头之前,需要识别请求是否为 CORS 请求。

默认情况下,CloudFront 会尽可能少地转发标头到源站,因为源站需要的标头越少,缓存命中率就会越高(因为未发送到源站的任何标头都无法导致源站改变其响应,因此对于给定请求的所有响应都不会发生变化,因此可被缓存)。但对于 CORS 请求,我们需要 S3 看到一些特定的标头,以便它可以相应地做出反应。

在缓存行为配置中,您需要将这三个请求标头列入白名单,以便将它们转发到源站。

Access-Control-Request-Headers
Access-Control-Request-Method
Origin

一旦这个改变完成,可能需要进行失效。


2

补充一下'Michael - sqlbot'的回答,现在似乎还需要将Access-Control-Allow-Origin头白名单化。它可能不会在下拉菜单中显示;那么你就需要手动输入!

我还附加了其他一些配置,这些配置对我有帮助,也许对其他人有用:https://stackoverflow.com/a/67929204/5657783


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