如何设置S3 CORS AllowedOrigin
配置,使其动态回显Access-Control-Allow-Origin
标题中的请求域?
在帖子"CORS with CloudFront, S3, and Multiple Domains"中,建议将AllowedOrigin
设置为<AllowedOrigin>*</AllowedOrigin>
即可。但是,S3会返回Access-Control-Allow-Origin: *
。
Access-Control-Allow-Origin: *
在我的情况下不起作用,因为我在JavaScript应用中使用image.crossOrigin = "use-credentials"
。使用此选项,S3返回Access-Control-Allow-Credentials: true
。然后,对using wildcard as the allowed origin in conjunction with credentials is not permitted。
为什么需要这样做的背景:
在我的设置中,对S3上的图像的访问必须通过我们的域,其中需要进行身份验证以限制访问并检查帐户是否有权访问图像。如果是,则服务器返回302重定向到S3 URL。
要使身份验证生效,必须设置image.crossOrigin = "use-credentials"
,以便请求使用所需的凭据访问我的服务器。 (顺便提一下,当我在Firefox 30.0和Chrome 35.0.1916.153上进行测试时,如果crossOrigin
设置为anonymous
,则仍然会发送凭据。但是在Safari 7.0.4上没有。一致的跨浏览器行为只能使用use-credentials
获得。)。
由于浏览器透明地重定向到S3 URL,因此也会发送凭据。
答案 0 :(得分:35)
AWS的CORS文档没有记录这一点,但我设法在thread on AWS Developer Forums中得到答案,在那里我发现AWS改变了回应请求域的原始行为*
用于AllowedOrigin
。
要让S3动态回显请求域,必须将AllowedOrigin
设置为:
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
答案 1 :(得分:6)
对我来说,它似乎是某种缓存问题(即使我没有使用cloudfront,只有S3)。在URL中附加随机参数为我解决了问题,例如:
https://s3-amazon.com/bucket/file.jpg?d=3243253456346
我在S3中也有以下CORS设置:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>