S3 间歇性显示的请求资源上不存在“Access-Control-Allow-Origin”标头
Posted
技术标签:
【中文标题】S3 间歇性显示的请求资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource intermittently shown with S3 【发布时间】:2019-10-28 09:13:07 【问题描述】:我有一个函数可以GET
s 来自 S3 存储桶的图像/视频。当我的应用程序首次加载时,该函数会完美地返回图像/视频。但是,如果我上传一个新的图像/视频并获取一个新的签名 URL 来检索它,我会收到以下错误(并且图像/视频无法加载):
从源“http://localhost:3000”访问“https://s3-bucket-name.s3.amazonaws.com/blah/blah”处的 XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。
我已将 S3 存储桶的权限设置为:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我的代码如下所示:
const request = new XMLHttpRequest();
const media = document.createElement('img');
request.onprogress = (e) =>
updateLoadingBar(e.percent);
;
request.onreadystatechange = (e) =>
if (request.readyState === 4)
media.src = URL.createObjectURL(request.response);
;
request.responseType = 'blob';
request.open('get', url);
request.send();
一些快速说明:
-
每次都使用相同的函数在我的后端 API 上生成 S3 签名 URL。
如果我打开了 Chrome 开发工具并在
Network
选项卡中选中了 Disable cache
,它可以正常加载。
感谢您提出任何解决此错误的建议。谢谢!
【问题讨论】:
酷。在incognito
或其他浏览器中会发生什么……?
@Panther incognito
Chrome 中的模式:同样的错误。 Firefox(任何模式):每次都能完美运行。 Safari:与 Chrome 一样失败(除了打开开发工具似乎没有帮助)。还需要注意的是,我没有使用任何浏览器扩展程序,并且在另一台计算机上测试时也会发生同样的错误。
你的api和前端在同一个域吗?当我的数据库与我的站点位于不同的域时,这发生在我身上。你试过这个amazon s3 cors
【参考方案1】:
在XMLHttpRequest
中禁用缓存允许它工作:
request.open('get', url);
request.setRequestHeader('cache-control', 'no-cache, must-revalidate, post-check=0, pre-check=0');
request.send();
如果有人能解释为什么在 cmets 中,我将非常感激 :)
【讨论】:
S3 的 CORS 实现并不完全正确,我怀疑您的解决方案实际上也不“正确”,而可能只是注入了一个标头,导致 Chrome 发送 S3 正确处理的请求。如果我是对的,request.setRequestHeader('cache-control', 'internet-cats, max-lives=9')
会产生同样的效果。以上是关于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”标头