← 中文资源

简体中文版本

排查 HTTP 缓存 Vary 头不匹配

发现缺失或错误的 Vary 响应头导致共享缓存把某语言或编码的响应错误地发给其他客户端。

阅读英文原文

目标

用户偶尔看到其他语言版本,或只支持 gzip 的客户端收到 Brotli 负载,因为缓存键忽略了请求头。本配方用不同 Accept-Encoding 与 Accept-Language 请求同一 URL,观察是否命中错误变体,再确认修复后 Vary 头能把缓存正确分区,避免缓存污染。

步骤要点

  1. 用两种编码请求同一资源,检查 content-encoding 与 vary。
  2. 用不同语言头重复请求,确认没有串语言。
  3. 为响应添加 Vary 或把变体纳入缓存键。
  4. 遍历多种编码验证每个变体独立缓存。
curl -sI -H 'Accept-Encoding: gzip' https://cdn.example.com/app.js | grep -i 'content-encoding\|vary'
curl -sI -H 'Accept-Encoding: br'   https://cdn.example.com/app.js | grep -i 'content-encoding\|vary'

排错提示

  • Vary 头在但缓存仍归一会继续出错,需显式纳入缓存键。
  • 语言串扰可通过按语言分 URL 解决。
  • 对过多头 Vary 会拉低命中率。

适用边界

  • 不覆盖浏览器私有缓存。
  • 需要能控制缓存键。