跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

使用 Vary 缓存同一 URL 的多个版本

您的源站可以通过返回 Vary 响应标头,为同一个 URL 提供不同的响应 —— 例如根据 Accept-Language 提供不同的语言,或者根据 Accept 提供不同的格式。Cloudflare 的缓存现在直接在 缓存规则(Cache Rules) 中遵循该标头,因此同一个 URL 可以保存多个缓存版本,并且每个请求都与正确的版本进行匹配。以前必须绕过缓存以保持正确性的内容现在可以被缓存,遵循标准的 HTTP 缓存行为

发生了什么变化

您的源站现在通过在其 Vary 响应中列出哪些请求标头重要来决定它们,而您则控制 Cloudflare 如何处理每一个。当您使用缓存规则启用了 Vary 且响应包含 Vary 标头时,列出的请求标头将成为缓存键的一部分。

对于您的源站变化所依赖的每个标头,选择以下三个操作之一:

操作 行为 最适用于
normalize 在匹配之前将等效的标头值转换为相同的缓存键值,折叠冗余版本。 大多数 AcceptAccept-LanguageAccept-Encoding 用例。
passthrough 使用原始标头值选择缓存版本,并将其不作修改地转发到源站。 当标头值中逐字节的差异应当创建新版本时。
bypass 只要此标头名称出现在源站的 Vary 响应中,就绕过缓存。 按用户的值,或包含太多可能值以至于无法安全缓存的标头。

优势

  • 更高的缓存命中率normalize 将语义上等效的标头视为一个版本。例如,Accept-Language: en-US, fr;q=0.8Accept-Language: fr;q=0.8, en-GB 都解析为相同的缓存键,因此您可以从缓存而非源站提供更多请求的服务。
  • 正确的内容协商:请求始终接收与其标头相匹配的缓存版本,从而使语言和格式变体保持准确。
  • 无需更改源站或 Worker:如果您的源站已经发送 Vary,您完全可以在缓存规则(Cache Rules)中配置该行为。
  • 符合标准:缓存键计算遵循 RFC 9111,并且 Vary: * 像 RFC 9110 要求的那样继续绕过缓存。

可用性

缓存规则中的 Vary 适用于所有计划(免费版、专业版、商业版和企业版)。对于 Workers 子请求中的每个请求控制,请使用 cf.vary 属性。

开始使用

Cloudflare 仪表板Cache(缓存) > Cache Rules(缓存规则) 下配置 Vary,或通过 Rulesets API 进行配置。要了解 Vary 如何影响缓存键以及每个操作的工作原理,请参阅 Vary缓存规则 Vary 设置

不可缓存的响应现在将返回 BYPASS 状态

只要响应不可缓存,Cloudflare 现在就会返回 BYPASS 缓存状态,而不是像以前那样根据 Cloudflare 选择不缓存响应的原因而混合返回 BYPASSMISS

Cloudflare 可能拒绝缓存响应有多种原因 —— 例如,响应超出了您计划的 最大可缓存文件大小、源站发送了 Cache-Control: no-cacheprivatemax-age=0、响应包含 Set-Cookie 标头,或者请求包含 Authorization 标头。

以前,只有其中一些情况会返回 BYPASS。其他情况(例如响应超出最大可缓存文件大小)在每次请求时都会返回 MISS,无论 源站缓存控制(Origin Cache Control) 是开启还是关闭。因为该响应永远无法被缓存,所以每个随后的请求也会返回 MISS,这看起来与损坏的缓存没有什么区别,很难区分 Cloudflare 是在尝试缓存资产但失败了,还是故意选择不缓存它。

BYPASS 现在一致地表示 Cloudflare 拒绝缓存该响应,无论出于何种原因。MISS 专门保留用于在请求时未在本地缓存中的可缓存响应。

您的分析数据中将出现什么变化

在此更改部署后,您应该会看到:

  • MISS 率下降:不可缓存的响应不再计为缓存未命中。
  • BYPASS 率上升:这些相同的响应现在报告为绕过(bypass)。
  • 缓存命中率上升:命中率计算不再包含永远无法被缓存的不可缓存流量,从而为您提供更准确的缓存效果视图。

您的总请求量和源站流量没有变化 —— 只有缓存状态标签不同。

浏览器缓存 TTL 行为得以保留

缓存状态标签是唯一发生改变的内容 —— 针对任何给定的响应,浏览器缓存 TTL 的处理与以前完全相同:

  • 历史上因为 Cloudflare 拒绝缓存而返回 MISS 的响应(例如,超过最大可缓存文件大小的响应)现在返回 BYPASS,但继续应用浏览器缓存 TTL —— 就像它们被标记为 MISS 时一样。
  • 历史上返回 BYPASS 并跳过浏览器缓存 TTL 的响应继续跳过浏览器缓存 TTL。

在两种情况下,应用浏览器缓存 TTL 的决定取决于 Cloudflare 不缓存响应的深层原因,而不是取决于新的 BYPASS 标签。