Cloudfront CORS 仅适用于子域

Posted

技术标签:

【中文标题】Cloudfront CORS 仅适用于子域【英文标题】:Cloudfront CORS only works for subdomain 【发布时间】:2018-01-13 15:36:34 【问题描述】:

我对使用 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

两者都按预期返回值:

访问控制允许来源:https://musicjungle.com.br

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

访问控制最大年龄:3000 访问控制允许凭据:真

变化:来源、访问控制请求标头,

访问控制请求方法

但是当我尝试使用 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

访问控制允许来源:https://www.musicjungle.com.br

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

访问控制最大年龄:3000 访问控制允许凭据:真

以下命令未按预期返回标头

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”。

【问题讨论】:

【参考方案1】:

如果我理解正确,我会说这是 CloudFront 的请求标头缓存设置的问题......

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

——Source.

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

建立新设置后,为受影响的文件创建一个无效

【讨论】:

关于创建失效以破坏缓存的重要提示

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

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

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

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

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

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

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