使S3 CORS Access-Control-Allow-Origin动态回应请求域

时间:2014-06-26 07:13:25

标签: amazon-s3 cors

如何设置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,因此也会发送凭据。

2 个答案:

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