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

Jas*_*eow 13 amazon-s3 cors

如何设置S3 CORS AllowedOrigin配置,使其动态回显Access-Control-Allow-Origin标头中的请求域?

在帖子"CORS with CloudFront,S3和Multiple Domains"中,建议设置AllowedOrigin<AllowedOrigin>*</AllowedOrigin>执行此操作.但是,S3会返回Access-Control-Allow-Origin: *.

Access-Control-Allow-Origin: *在我的情况下不起作用,因为我image.crossOrigin = "use-credentials"在JavaScript应用程序中使用.使用此选项,S3返回Access-Control-Allow-Credentials: true.然后对图像的跨源访问失败,因为不允许使用通配符作为允许的来源与凭证一起使用.

为什么需要这样的背景:

在我的设置中,对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,因此也会发送凭据.

Jas*_*eow 36

AWS的CORS文档没有记录这一点,但我设法在AWS开发者论坛的一个帖子中得到答案,在那里我发现AWS改变了回应请求域的原始行为(如果*正在使用的话)AllowedOrigin.

要使S3动态回显请求域,AllowedOrigin必须将其设置为:

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
Run Code Online (Sandbox Code Playgroud)


Dee*_*Joy 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>
Run Code Online (Sandbox Code Playgroud)