【发布时间】:2020-12-29 03:30:06
【问题描述】:
我的网站正在从具有以下配置的 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>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
此 S3 存储桶连接到具有以下缓存/源策略的 CloudFront 分配:
我的网站使用多个域,例如example1.com,example2.com,它完美地加载了所有图像。当某些库或 SDK 尝试访问这些图像时,问题就开始了,我有时会随机出现跨源错误。
我认为问题在于,CloudFront 缓存了源。因此,如果一个用户尝试从 example1.com 获取image.jpg,然后其他一些用户尝试从 example2.com 获取image.jpg,CloudFront 会将源 example1.com 缓存到请求中,这将导致跨源。为了克服这个问题,我使用了?v=randomInt 查询参数。这是一种不好的做法,因为我总是得到 image.jpg 的新副本,实际上没有使用缓存。
有没有办法不缓存原始标头,因此 example1.com 和 example2.com 都可以使用自己的来源获取image.jpg?我尝试从缓存策略中删除标头,但没有任何运气。
报错如下(watermark.js尝试用crossorigin="anonymous"获取图片后:
Access to image at 'https://cdn.treedis.com/tours/3453/tags/icons/8d2d0686-b3b9-4693-8167-0b652793c224.png' from origin example2.com has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
一旦我将?v=1234 添加到图像的 URL,它就可以正常工作。所以一定是缓存。
【问题讨论】:
-
你能显示确切的错误信息吗?
-
@jellycsc 我现在用错误消息编辑了问题
标签: amazon-s3 caching cors amazon-cloudfront