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 仅适用于子域的主要内容,如果未能解决你的问题,请参考以下文章
Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)
从 CloudFront 到服务器的 CORS 问题以获取字体