S3:请求的资源上不存在 Access-Control-Allow-Origin 标头

Posted

技术标签:

【中文标题】S3:请求的资源上不存在 Access-Control-Allow-Origin 标头【英文标题】:S3: No Access-Control-Allow-Origin header is present on the requested resource 【发布时间】:2018-06-20 02:00:04 【问题描述】:

我在 eu-west-1 区域中有一个 S3 存储桶,我们称之为 my-bucket

在那个桶里有一张照片,我们叫它some-file.jpg

如果我通过浏览器访问这两个 url,我可以检索到该图片(存储桶中的所有对象都是公开的)(请记住,这些是示例,而不是真实的 url):

https://my-bucket.s3.amazonaws.com/some-file.jpg

https://s3-eu-west-1.amazonaws.com/my-bucket/some-file.jpg

但是,我正在尝试获取有关该图片的一些信息,为此我使用了充满活力的.js,它会尝试检索文件。

但是,当 url 为:https://my-bucket.s3.amazonaws.com/some-file.jpg 时,它会失败,并出现以下 CORS 错误:

Access to Image at 'https://my-bucket.s3.amazonaws.com/some-file.jpg' from origin 'https://example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://example.com' is therefore not allowed access

我已确保存储桶的 CORS 政策接受所有来源:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我的猜测是https://s3-eu-west-1.amazonaws.com/my-bucket/some-file.jpg 发送Access-Control-Allow-Origin 而另一个没有。我该如何解决这个问题?

【问题讨论】:

问题可能不在于 URL——这可能是巧合。如果您清除浏览器的缓存,您应该会发现它们的行为相同,并且都不起作用。 S3 历来有一个问题,当您像这样两次请求对象时会出现问题,一次来自 html,一次来自 javascript,在 serverfault.com/a/856948/15316 中有更完整的描述。该问题提到了 CloudFront,但问题的出现与您是否使用 CloudFront 无关。 【参考方案1】:

更新 CORS 标头后是否清除了浏览器缓存

我遇到的问题是 Chrome 正在缓存带有标头的图像(不包含 CORS 数据),所以无论我尝试在 AWS 中更改什么,我都看不到我的 CORS 标头.

清除 Chrome 缓存并重新加载页面后,图像具有预期的 CORS 标头

【讨论】:

我遇到了这个问题,并通过删除所有缓存的 IndexedDB 实例来解决它。这种方法的灵感来自这个答案。 它对我有用。这对我来说是一个很难发现的问题【参考方案2】:

尝试通过 CORS 代理运行镜像。

fetch('https://cors.now.sh/https://my-bucket.s3.amazonaws.com/some-file.jpg')
  .then(console.log)
  .catch(console.error)

这看起来像个 hack,但对我来说效果很好。

【讨论】:

以上是关于S3:请求的资源上不存在 Access-Control-Allow-Origin 标头的主要内容,如果未能解决你的问题,请参考以下文章

请求的资源(AWS、API Gateway、S3、CORS)上不存在“Access-Control-Allow-Origin”标头

反应 - 从 s3 获取图像时,请求的资源上不存在“Access-Control-Allow-Origin”标头

AWS S3 存储桶 CORS 策略错误:请求的资源上不存在“Access-Control-Allow-Origin”标头

将大于 1MB 的文件上传到 s3,出现 cors 错误。请求的资源上不存在“Access-Control-Allow-Origin”标头

XMLHttpRequest 无法加载请求的资源上不存在“Access-Control-Allow-Origin”标头。 AWS S3,视网膜.JS

从 Amazon AWS s3 存储桶错误获取 Html5:请求的资源上不存在“Access-Control-Allow-Origin”标头