使用 Vary 缓存同一 URL 的多个版本
您的源站可以通过返回 Vary ↗ 响应标头,为同一个 URL 提供不同的响应 —— 例如根据 Accept-Language 提供不同的语言,或者根据 Accept 提供不同的格式。Cloudflare 的缓存现在直接在 缓存规则(Cache Rules) 中遵循该标头,因此同一个 URL 可以保存多个缓存版本,并且每个请求都与正确的版本进行匹配。以前必须绕过缓存以保持正确性的内容现在可以被缓存,遵循标准的 HTTP 缓存行为 ↗。
您的源站现在通过在其 Vary 响应中列出哪些请求标头重要来决定它们,而您则控制 Cloudflare 如何处理每一个。当您使用缓存规则启用了 Vary 且响应包含 Vary 标头时,列出的请求标头将成为缓存键的一部分。
对于您的源站变化所依赖的每个标头,选择以下三个操作之一:
| 操作 | 行为 | 最适用于 |
|---|---|---|
normalize |
在匹配之前将等效的标头值转换为相同的缓存键值,折叠冗余版本。 | 大多数 Accept、Accept-Language 和 Accept-Encoding 用例。 |
passthrough |
使用原始标头值选择缓存版本,并将其不作修改地转发到源站。 | 当标头值中逐字节的差异应当创建新版本时。 |
bypass |
只要此标头名称出现在源站的 Vary 响应中,就绕过缓存。 |
按用户的值,或包含太多可能值以至于无法安全缓存的标头。 |
- 更高的缓存命中率:
normalize将语义上等效的标头视为一个版本。例如,Accept-Language: en-US, fr;q=0.8和Accept-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 选择不缓存响应的原因而混合返回 BYPASS 和 MISS。
Cloudflare 可能拒绝缓存响应有多种原因 —— 例如,响应超出了您计划的 最大可缓存文件大小、源站发送了 Cache-Control: no-cache、private 或 max-age=0、响应包含 Set-Cookie 标头,或者请求包含 Authorization 标头。
以前,只有其中一些情况会返回 BYPASS。其他情况(例如响应超出最大可缓存文件大小)在每次请求时都会返回 MISS,无论 源站缓存控制(Origin Cache Control) 是开启还是关闭。因为该响应永远无法被缓存,所以每个随后的请求也会返回 MISS,这看起来与损坏的缓存没有什么区别,很难区分 Cloudflare 是在尝试缓存资产但失败了,还是故意选择不缓存它。
BYPASS 现在一致地表示 Cloudflare 拒绝缓存该响应,无论出于何种原因。MISS 专门保留用于在请求时未在本地缓存中的可缓存响应。
在此更改部署后,您应该会看到:
- MISS 率下降:不可缓存的响应不再计为缓存未命中。
- BYPASS 率上升:这些相同的响应现在报告为绕过(bypass)。
- 缓存命中率上升:命中率计算不再包含永远无法被缓存的不可缓存流量,从而为您提供更准确的缓存效果视图。
您的总请求量和源站流量没有变化 —— 只有缓存状态标签不同。
缓存状态标签是唯一发生改变的内容 —— 针对任何给定的响应,浏览器缓存 TTL 的处理与以前完全相同:
- 历史上因为 Cloudflare 拒绝缓存而返回
MISS的响应(例如,超过最大可缓存文件大小的响应)现在返回BYPASS,但继续应用浏览器缓存 TTL —— 就像它们被标记为MISS时一样。 - 历史上返回
BYPASS并跳过浏览器缓存 TTL 的响应继续跳过浏览器缓存 TTL。
在两种情况下,应用浏览器缓存 TTL 的决定取决于 Cloudflare 不缓存响应的深层原因,而不是取决于新的 BYPASS 标签。