我们正在使用Amazon S3 + CloudFront来提供JSON文件。我们上传了两个文件,让我们考虑为j1.json和j2.json。这两个文件最初都在响应中响应有效的CORS头,但是当在j2.json上运行失效时,它的头响应发生了变化,我们正面临CORS问题。
在S3存储桶上设置CORS权限 -
$('a[href^="http://replaceThis.com"]').each(function(){
var thisHref = $(this).attr('href');
thisHref.replace('replaceThis','withThis');
});
j1.json的响应标头
两个JSON文件都在同一个存储桶中,但j2.json响应缺少这些标头
<?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>
我们尝试删除并再次上传对象,它在响应中没有响应CORS标头。这个问题的可能原因是什么?以及如何解决?
答案 0 :(得分:10)
在S3返回正确的CORS响应头之前,需要查看该请求是否为CORS请求。
默认情况下,CloudFront会尽可能少地将标头转发到源,因为源所需的标头越少,您的缓存命中率就越高(因为任何未发送到源的标头都不会导致改变其响应的起源,因此预期对给定请求的所有响应都不会变化,因此可以缓存。但是对于CORS请求,我们需要S3来查看一些特定的头文件,以便它可以做出相应的反应。
在缓存行为配置中,您需要将这3个请求标头列入白名单以转发到源。
Access-Control-Request-Headers
Access-Control-Request-Method
Origin
一旦此更改完成,也可能适用失效。
答案 1 :(得分:0)
刚刚添加到'Michael - sqlbot'的答案中,现在似乎还需要将Allow-Control-Allow-Origin
标头列入白名单。它可能不会显示在下拉列表中;然后你需要输入它!
我还附加了其他帮助我使其正常工作的配置,可能会对某人有所帮助:https://stackoverflow.com/a/67929204/5657783