Cloudfront CORS仅适用于子域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cloudfront CORS仅适用于子域相关的知识,希望对你有一定的参考价值。

使用Cloudfront + S3,我对CORS有一种非常奇怪的行为

我跑的时候

curl -I -s -X GET -H "Origin: https://myapp.com" https://s3.amazonaws.com/myapp/assets/fontawesome-webfont.woff | grep Access

curl -I -s -X GET -H "Origin: https://**www.**myapp.com" https://s3.amazonaws.com/myapp/assets/fontawesome-webfont.woff | grep Access

两者都按预期返回值:

Access-Control-Allow-Origin:https://musicjungle.com.br

Access-Control-Allow-Methods:GET Access-Control-Expose-Headers:ETag

Access-Control-Max-Age:3000 Access-Control-Allow-Credentials:true

变化:原点,访问控制请求标题,

访问控制请求法

但是当我尝试使用Cloudfront URL运行相同的curl时,只需www子域工作

curl -I -s -X GET -H "Origin: https://www.myapp.com" https://d1bfllp5zjnl7u.cloudfront.net/assets/fontawesome-webfont.woff | grep Access

Access-Control-Allow-Origin:https://www.musicjungle.com.br

访问控制允许方法:GET,PUT,POST,DELETE,HEAD

Access-Control-Max-Age:3000 Access-Control-Allow-Credentials:true

以下命令不会按预期返回标头

curl -I -s -X GET -H "Origin: https://myapp.com" https://d1bfllp5zjnl7u.cloudfront.net/assets/fontawesome-webfont.woff | grep Access

任何想法为什么会发生这种情况?我已经在S3 CORS配置上允许两个服务器的Origin(我们可以在上面看到),但它似乎是Cloudfront配置上的东西,只允许“www.myapp.com”。

答案

如果我理解你的话,我会说这是CloudFront的Request Headers缓存设置的问题......

默认情况下,CloudFront在边缘位置缓存对象时不考虑标头。如果您的源返回两个对象,并且它们仅与请求标头中的值不同,则CloudFront仅缓存该对象的一个​​版本。

- Source

因此,转到您的分发并编辑您的行为,以允许CloudFront根据Origin标头的值缓存对象:

CF Headers Cache Configuration

建立新设置后,为受影响的文件创建Invalidation。

以上是关于Cloudfront CORS仅适用于子域的主要内容,如果未能解决你的问题,请参考以下文章

Cors Ajax 请求适用于子域但不适用于主域

CORS 仅适用于一个请求 [重复]

Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)

从 CloudFront 到服务器的 CORS 问题以获取字体

.htaccess 仅用于主页重定向到子域(OpenCart)

跨子域的跨域资源共享 (CORS)