为啥没有在 CORS 未命中时设置“Vary: Origin”响应?

Posted

技术标签:

【中文标题】为啥没有在 CORS 未命中时设置“Vary: Origin”响应?【英文标题】:Why isn't 'Vary: Origin' response set on a CORS miss?为什么没有在 CORS 未命中时设置“Vary: Origin”响应? 【发布时间】:2014-10-09 08:46:13 【问题描述】:

发出 CORS 请求时,如果请求的 Origin 在允许的来源列表中,则响应包含 Access-Control-Allow-Origin 标头和 Vary: Origin 标头。

Vary: Origin 告诉后续 CDN 等响应是根据请求者 Origin 标头值协商的。

问题是(我已经测试了领先的 CDN 提供商),如果请求者没有在他们的请求中提供 Origin 标头,或者不是允许的值之一的 Origin 值,则响应确实不包括 Vary: Origin 在响应中。

执行 CORS 的 CDN 是否应始终在响应标头中使用 Vary: Origin 进行响应?如果不这样做,CDN 会相信它可以对任何 Origin 值提供相同的响应。再说一次,可以通过发出许多具有随机原始值的请求来填充 CDN 缓存。

【问题讨论】:

【参考方案1】:

是的。如果请求可能包含具有不同值的Access-Control-Allow-Origin,则CDN 应始终以Vary: Origin 响应,即使对于没有Access-Control-Allow-Origin 标头的响应也是如此。您的分析是正确的:如果标头并不总是存在,则可能会用不正确的值填充缓存。

【讨论】:

正如我所想。我怀疑自己,因为 Amazon CloudFront 和 Azure CDN 仅在 Origin 存在且匹配时才返回 Vary: Origin,否则会忽略它。只有 Google 为每个请求输出 Vary: Origin。我想知道为什么网络上关于这个问题的报道如此之少? 它不会经常出现(因为将来源列入白名单的 CORS 实现较少,大多数只使用 *),并且当它出现时,很难调试。我在 CORS in Action 中有一个关于此的部分。 这个问题也已经在AWS S3 Forums上报告了 将 Amazon CloudFront 与 Web 源(不是 S3)一起使用时,将 Origin 标头从 CloudFront 转发到您的源将避免此问题。理解正确吗?docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 实际上,这会导致 Chrome 出现一些问题:bugs.chromium.org/p/chromium/issues/detail?id=260239。难怪 Google 会为每个请求输出 Vary: Origin

以上是关于为啥没有在 CORS 未命中时设置“Vary: Origin”响应?的主要内容,如果未能解决你的问题,请参考以下文章

我没有设置 CORS 标头,即使它已设置。为啥?

为啥 _mm_stream_ps 会产生 L1/LL 缓存未命中?

为啥禁止没有凭据的 CORS?

为啥浏览器中未设置 res 标头中的 cookie?

为啥即使未启用 CORS,HTTP 请求也会在 Action 中处理? [复制]

为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检