跳转到内容
搜索文档

Vary

最后更新 查看 MarkdownAgent 设置

Vary HTTP 响应标头告诉 Cloudflare,源站可以根据请求标头为同一 URL 提供不同的响应。例如,源站可能根据 Accept-Language 提供不同语言,或根据 Accept 提供不同内容格式。

默认情况下,Cloudflare 的 CDN 从请求的 URL 和少量特定标头构建 cache keysCache Rules 可以预先向 cache key 添加其他请求属性。Vary 响应标头让源站决定 Cloudflare 收到响应时哪些请求标头重要。

本页解释 Vary 如何影响缓存。要配置 Vary,请使用 Cache Rules 设置中的 Vary,或 Workers 子请求的 cf.vary

此功能与 Vary for images 不同,后者通过单独的 cache variants 规则根据 Accept 标头提供图像格式变体。

可用性

FreeProBusinessEnterprise

Availability

Yes

Yes

Yes

Yes

Vary 如何影响 cache keys

当 Cloudflare 缓存带有 Vary 标头的响应时,列出的请求标头成为该响应 cache key 的一部分,遵循 RFC 9111 中描述的 HTTP 缓存行为。同一 URL 随后可以有多个缓存版本,每个版本由源站 Vary 响应中命名的请求标头值选择。

Cloudflare 不会因为 Cache Rule 中配置了 Vary 就对每个缓存响应进行 vary。源站响应必须包含 Vary 标头。Cloudflare 然后使用为每个列出标头配置的操作来决定哪个请求标头值添加到 cache key。

例如,假设源站返回此响应:

Vary: Accept-Language
Cache-Control: public, max-age=3600

这告诉 Cloudflare Accept-Language 请求标头的值应成为 cache key 的一部分。

accept-language 配置为 normalize 时,这两个请求可以使用相同的缓存版本:

Accept-Language: en-US, fr;q=0.8
Accept-Language: fr;q=0.8, en-GB

两个请求标头都规范化为相同的语言偏好顺序 en,fr。具有不同规范化值的请求(例如 Accept-Language: fr, en;q=0.8)会创建或选择同一 URL 的不同缓存版本。

当响应在多个标头上 vary 时,Cloudflare 在 cache key 中包含每个列出的标头。例如,Vary: Accept, Accept-Language 的响应使用配置的 accept 值和配置的 accept-language 值来选择缓存响应。

如果源站响应不包含 Vary 标头,Cloudflare 正常缓存响应。如果源站响应包含配置为 bypass cache 的 Vary 标头名称,Cloudflare 不会存储该响应。

操作

每个配置的标头使用以下三种操作之一:

Action Meaning When to use
normalize 在选择缓存版本之前规范化请求标头值。对于选定的标头,Cloudflare 还可能将规范化值转发到源站。 大多数 AcceptAccept-LanguageAccept-Encoding 用例。
passthrough 使用原始请求标头值选择缓存版本。标头原样转发到源站。 当标头值的逐字节差异应创建不同版本时。
bypass 当此标头名称出现在源站的 Vary 响应中时绕过缓存。 具有太多可能值的标头、每用户值或您不想缓存的值。

Normalize

normalize 通过将等效的请求标头值转换为相同的 cache key 值来减少不必要的缓存版本。

例如,这两个 Accept 标头可以规范化为相同的值:

Accept: text/html, application/json;q=0.9
Accept: application/json;q=0.9, text/html

Passthrough

passthrough 在选择缓存版本时使用原始请求标头值。如果字节不同,语义等效的值仍可能创建不同的缓存版本。

例如,在 passthrough 下,这两个请求选择不同的缓存版本:

Accept: text/html, application/json
Accept: application/json, text/html

仅当确切的标头值对源站重要且应对缓存重要时才使用 passthrough

Bypass

bypass 告诉 Cloudflare 当源站的 Vary 响应包含该标头名称时不缓存响应。

例如,如果配置将 user-agent 设置为 bypass,则包含此标头的响应不会被缓存:

Vary: User-Agent

规范化行为

Vary 规范化是配置的操作为 normalize 时执行的规范化。它影响 Cloudflare 如何选择缓存版本,对于某些标头,还影响 Cloudflare 转发到源站的内容。

规范化是可选的,但建议大多数部署使用,因为它减少缓存版本数量并提高缓存命中率。

当标头的操作为 normalize 时,Cloudflare 使用规范化值选择缓存版本。规范化可能是有损的:它可能重新排序值、丢弃质量值、小写值或移除不在配置 allowlist 中的条目。

源站请求标头

对于 AcceptAccept-LanguageAccept-Encoding(启用 Respect Strong ETags 时),Cloudflare 还可能将规范化标头值转发到源站。这使源站生成的响应与 Cloudflare 用于缓存的 cache key 值保持一致。

例如,如果 accept-language 将这两个请求规范化为 en,fr,Cloudflare 在缓存未命中或重新验证时将 Accept-Language: en,fr 转发到源站:

Accept-Language: en-US, fr;q=0.8
Accept-Language: fr;q=0.8, en-GB

转发规范化值可防止 Cloudflare 将一个原始标头值生成的响应存储在另一个请求可能错误复用的更宽泛规范化值下。

此源站请求重写适用于:

  • Accept
  • Accept-Language
  • Accept-Encoding(仅当启用 Respect Strong ETags 时)

此重写不适用于:

  • 配置为 passthrough 的标头
  • 配置为 bypass 的标头
  • 其他通用标头

此重写在 Cloudflare 收到源站响应之前发生,因此基于您的 Cache Rule 配置。如果 AcceptAccept-LanguageAccept-Encoding 配置为 normalize,Cloudflare 在转发到源站时重写该请求标头,即使源站的最终响应未在 Vary 中列出该标头。缓存选择和绕过仍取决于源站响应的 Vary 标头。

如果规范化将标头减少为空值——例如,因为请求的值都不匹配配置的 media_typeslanguages 列表——Cloudflare 从源站请求中移除该标头。

Accept

Cloudflare 按以下步骤规范化 Accept 请求标头:

  1. 将 MIME 类型转换为小写。
  2. 去除可选空白。
  3. 按质量值排序 MIME 类型。相同质量值的类型按字母顺序排序。
  4. 去除参数。

质量值用于排序,然后从规范化值中移除。q=0 被保留,因为它表示"不可接受",应与低优先级值保持可区分。

您可以提供可选的 media_types 列表。如果提供,不在列表中的任何 MIME 类型将从规范化值中移除。

Accept-Language

Cloudflare 按以下步骤规范化 Accept-Language 请求标头:

  1. 将语言转换为小写。
  2. 去除可选空白。
  3. 按质量值排序语言。相同质量值的语言按字母顺序排序。
  4. 去除参数。
  5. 去除区域变体。例如,en-US 变为 en。如果同一语言的多个区域变体存在,它们合并为单个项。

质量值用于排序,然后从规范化值中移除。q=0 被保留,因为它表示"不可接受",应与低优先级值保持可区分。

您可以提供可选的 languages 列表。如果提供,不在列表中的任何语言将从规范化值中移除。如果列表中的项指定区域变体,且请求标头中有匹配项,区域变体保留在规范化值中。

Accept-Encoding

默认情况下,Cloudflare 的 CDN 根据启用的压缩编码覆盖 Accept-Encoding 标头。如果启用 Brotli 压缩,转发到源站的 Accept-Encodinggzip, br。如果未启用 Brotli 压缩,转发到源站的 Accept-Encodinggzip。Cloudflare 随后可以根据访客的 Accept-Encoding 重新压缩缓存资源。详情请参阅 ETag headers

通过启用 Respect Strong ETags 可以关闭此行为。启用 Respect Strong ETags 后,访客的 Accept-Encoding 转发到源站,而非 Cloudflare 的压缩覆盖。如果为 Accept-Encoding 启用了 Vary 规范化,规范化值用于选择缓存版本和转发到源站的值。

由于 Cloudflare 在 Respect Strong ETags 关闭时控制 Accept-EncodingAccept-Encoding 规范化仅在 Respect Strong ETags 开启时重写源站请求。

Cloudflare 按以下步骤规范化 Accept-Encoding 请求标头:

  1. 将编码转换为小写。
  2. 去除可选空白。
  3. 按质量值排序编码。相同质量值的编码按字母顺序排序。
  4. 去除参数。

质量值用于排序,然后从规范化值中移除。q=0 被保留,因为它表示"不可接受",应与低优先级值保持可区分。

其他标头

对于 AcceptAccept-LanguageAccept-Encoding 以外的任何标头,Cloudflare 不知道该字段的语义。规范化限制在对任何标头都安全的转换:

  • 同一标头的多个标头字段行按接收顺序合并为单个逗号分隔值。
  • 每个值周围的可选空白被修剪。

值不会被重新排序、小写、去重或以其他方式更改,因为任意标头的顺序和内容可能具有意义。

例如,这两个标头字段行:

X-Custom-Header: Value2
X-Custom-Header: Value1

选择缓存版本时,Cloudflare 将这些值合并为 Value2,Value1。转发到源站的标头不会被重写。

清除行为

清除 URL 会清除该 URL 的所有缓存版本。您无需为每个 Vary 标头值发送单独的清除请求。这适用于针对缓存对象的清除方法,例如按 URL、标签、主机名、前缀清除或全部清除。

更改 Vary 配置本身不会清除缓存内容。由于新的 Vary 配置可能更改缓存版本的选择方式,请求可能会未命中并在新 cache keys 下重新填充,直到旧缓存条目过期或被清除。

这篇文档对您有帮助吗?