开启 gzip_vary on 并配合 add_header Vary "Accept-Encoding" always 和 Cache-Control: public, immutable, max-age=31536000,可精准区分压缩/未压缩响应缓存,提升 CDN 命中率并确保长期稳定缓存。
直接配置
并配合合理的
,就能解决因
导致的 CDN 缓存命中率下降问题。关键不在“加不加”,而在“加得对不对”——既要让压缩响应被正确区分缓存,又不能破坏共享缓存的复用逻辑。
确保 gzip_vary 开启且生效
Nginx 自带的
是最稳妥的方式,它只在实际执行了 gzip 压缩时才自动添加
响应头。这比手动
更精准,避免给未压缩响应也加头,造成 CDN 误判。
必须开启
,否则
不起作用
要覆盖常用静态资源类型(如
、
、
)
确认没有禁用 gzip 的规则(例如
在现代环境可移除)
统一 Vary 头存在性,避免条件缺失
只对触发压缩的响应加头。但若某次请求不带
,Nginx 不压缩、也不加
,CDN 就可能把该未压缩响应当作“通用版本”缓存并错误返回给 gzip 客户端。
所以要在同一 location 中补上兜底配置:
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
(
参数确保无论是否压缩都生效)
或更简洁地:在启用 gzip 的前提下,直接写
,配合
形成双重保障
搭配 immutable + max-age 实现长期稳定缓存
光有
不够,还得让 CDN 和浏览器愿意长期存这个“按编码分版本”的缓存。
对带哈希指纹的静态资源(如
),设
允许 CDN 和中间代理缓存
告诉浏览器:只要没过期,就别发
等验证请求,省去一次往返
注意:
仅适用于内容永不变更的资源,动态页或无哈希文件不要用
验证 CDN 是否真正尊重 Vary
很多缓存问题出在 CDN 层忽略
头。用
快速验证:
请求带
:
,检查响应是否有
和
请求不带压缩头:
,检查是否返回未压缩内容,且
头仍存在
两次请求的
或
应不同,说明 CDN 确实分开了缓存
如果两次响应完全一致,说明 CDN 没按
区分,需联系厂商确认是否支持或开启相关功能。
gzip_vary onCache-ControlVary: Accept-Encodinggzip_vary onVary: Accept-Encodingadd_header Vary Accept-Encodinggzip ongzip_varygzip_typesapplication/javascripttext/cssimage/svg+xmlgzip_disable "msie6"gzip_vary onAccept-Encoding: gzipVaryadd_header Vary "Accept-Encoding" always;alwaysadd_header Vary "Accept-Encoding";gzip_vary onVarymain.a1b2c3.jsCache-Control: public, immutable, max-age=31536000publicimmutableIf-None-MatchimmutableVarycurlAccept-Encoding: gzipcurl -H "Accept-Encoding: gzip" -I https://example.com/main.jsVary: Accept-EncodingContent-Encoding: gzipcurl -H "Accept-Encoding:" -I https://example.com/main.jsVaryETagLast-ModifiedVary