Amazon S3 + CloudFront CORS 问题

Amazon S3 + CloudFront CORS issue

我们正在使用 Amazon S3 + CloudFront 来提供 JSON 文件。我们上传了两个文件让我们认为是 j1.json 和 j2.json。这两个文件最初在响应中响应有效的 CORS header,但是当 运行 在 j2.json 上失效时,它的 header 响应发生了变化,我们面临着 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

的响应 header 秒

对 j2.json 的响应 header

两个 JSON 文件都在同一个存储桶中,但 j2.json 响应缺少这些 headers

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

我们尝试删除并再次上传 object,它没有在响应中响应 CORS headers。这个问题的可能原因是什么?以及如何解决?

在 S3 将 return 纠正 CORS 响应 headers 之前,它需要确定该请求是 CORS 请求。

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

在缓存行为配置中,您需要将这 3 个请求header列入白名单以转发到源。

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

此更改完成后,失效也可能是合适的。

补充一下'Michael - sqlbot'的答案,现在好像也需要加入白名单Allow-Control-Allow-Origin header。它可能不会显示在下拉列表中;那么您需要输入它!

我还附加了其他帮助我让它工作的配置,可能对某人有帮助:https://whosebug.com/a/67929204/5657783