Plainnotes

缓存串了:缺一个 Vary 头

2026-02-25 · 3 分钟网络

用户反馈“页面偶尔乱码”,复现不了。抓包发现同一个 URL,有时返回 gzip 编码的响应,有时是明文,而缓存层只按 URL 做键。

HTTP 的缓存键默认是方法加 URL,除非响应里带 Vary。内容协商(Accept-Encoding、Accept-Language)必须显式声明:

Vary: Accept-Encoding

nginx 的 gzip_vary on; 会自动加这个头。没有它,CDN 或反向代理可能把压缩版本发给不支持压缩的客户端,或者反过来。

同样的坑也出现在多语言站点:Vary: Accept-Language 缺失时,缓存会把中文页面发给英文用户。检查方法很简单:curl -I 看响应头里有没有对应的 Vary。