我正在尝试将 CORS 策略应用于我的 S3 存储桶,我观察到,如果在任何时间点修改 CORS 策略,上传到 S3 的旧文件仍然不使用新文件CORS 政策。例如
添加了以下 CORS 政策 -
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://app1.example.com</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-amz-meta-custom-header</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
已成功从托管在
https://app1.example.com
上的应用程序上传文件 a.jpeg。我还能够执行 GET 和 DELETE。现在我需要为我的另一个托管应用程序(例如 app2)使用相同的 S3 存储桶。所以我将 CORS 政策修改为 -
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://app1.example.com</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-amz-meta-custom-header</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://app2.example.com</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-amz-meta-custom-header</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
现在,当我尝试从
https://app2.example.com
获取文件 a.jpeg 时,我仍然看到以下错误
XMLHttpRequest cannot load <S3 URL>. Origin https://app2.mydomain.com is not allowed by Access-Control-Allow-Origin.
但是,如果我尝试从
https://app2.mydomain.com
上传新文件 b.jpeg,一切都会按预期进行。编辑
我忘了之前提到这一点,但我们的 S3 存储桶前面有一个 CloudFront CDN,但我在 Cloudfront 配置中找不到与设置 CORS 策略相关的任何配置。
是否有一种方法可以对以前上传的文件强制执行新的 CORS 政策?或者还有其他方法可以实现此功能吗?
CORS 标头是 CloudFront 中缓存响应的一部分 - 因此,虽然您可能在存储桶级别设置它们,但只有新对象才能看到它。缓存的对象需要过期才能显示新的标头。
考虑使您的 CloudFront 缓存失效 (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html) 或将 TTL 设置得更低,以强制 CloudFront 在合理的时间内从 S3 刷新对象时间范围。