忽略 Vary 头可使 Nginx 统一缓存 key,提升命中率;需配合 proxy_cache_path、proxy_cache 和 proxy_cache_valid 三者生效,并建议用 proxy_hide_header Vary 隐藏响应头。

直接在启用缓存的 location 块中,把 proxy_ignore_headers Vary; 写在 proxy_pass 之前,就能让 Nginx 忽略上游返回的 Vary 头,不再按它的值(比如 User-Agent、Accept-Encoding 或 Cookie)拆分缓存 key——这是归一化缓存、提升命中率最有效的手段之一。
为什么忽略 Vary 是关键一步
后端常默认加 Vary: User-Agent 或 Vary: Accept-Encoding,导致同一 URL 被存成几十个不同缓存副本。Nginx 本意是做精准适配,但实际内容若完全静态或与设备无关,这种分裂只会浪费空间、拖慢响应。
- 忽略后,Nginx 构建 cache key 时不再包含
Vary字段的值 - 所有用户请求都走同一个缓存条目,命中率显著上升
- 特别适合 CDN 前置、静态页、公共 API 配置
必须配套的三项配置
单写 proxy_ignore_headers Vary; 不起作用,它只是“松绑”,不是“自动缓存”。以下三者缺一不可:
-
已定义缓存区:在
http块中提前声明,例如:proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:10m max_size=1g; -
当前 location 启用缓存:写在同个
location中,且在proxy_ignore_headers之后、proxy_pass之前:proxy_cache mycache; -
明确缓存有效期:告诉 Nginx “哪些状态码缓存多久”,例如:
proxy_cache_valid 200 302 1h;(别用200 1h这种简写,会漏掉重定向)
要不要同步隐藏 Vary 头?
忽略 ≠ 删除。proxy_ignore_headers Vary; 只影响 Nginx 自身缓存逻辑,原始 Vary 头仍会透传给客户端或下游 CDN。如果你确认内容真与 Vary 字段无关,建议加一行:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
proxy_hide_header Vary;
这样既防止前端或 CDN 被误导,也避免暴露后端策略细节。注意:proxy_hide_header 不影响缓存行为,只控制响应头输出。
验证是否生效的两个信号
改完配置 reload 后,用 curl -I 请求目标路径,观察:
- 响应头里仍有
Vary: ...(说明是“忽略”而非误删) - 同时出现
X-Cache-Status: HIT(说明缓存已介入,且 key 已归一) - 多次请求耗时稳定在毫秒级,且
Age头递增

















