使用 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 设置。