Amazon S3 + CloudFront CORS问题

时间:2017-07-24 13:23:31

标签: javascript amazon-s3 cors amazon-cloudfront

我们正在使用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的响应标头

enter image description here

j2.json的响应标头 enter image description here

两个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标头。这个问题的可能原因是什么?以及如何解决?

2 个答案:

答案 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