Nginx 不支持“强制开启预压缩缓存”,而是通过启用 gzip/brotli 压缩、设置 Cache-Control(含 immutable)和 Vary: Accept-Encoding,使压缩响应可被浏览器高效缓存。

Nginx 本身不支持强制浏览器“开启预压缩缓存”——这个说法存在概念混淆。浏览器是否使用缓存、是否接受并解压 gzip 或 br(Brotli)响应,完全取决于:
- 客户端请求头中是否带
Accept-Encoding: gzip, br - 服务端是否实际返回了压缩内容(如
Content-Encoding: gzip或br) - 响应头中是否设置了有效的缓存控制指令(如
Cache-Control、Expires)
Nginx 可以做的是:确保压缩响应被正确生成 + 同时附带强缓存头,让浏览器愿意缓存该压缩后的资源。下面分两部分说明核心配置要点:
✅ 正确理解:不是“强制开启预压缩缓存”,而是“让压缩资源可被缓存”
浏览器缓存的是整个 HTTP 响应体(含已压缩字节),不是“先解压再缓存”。只要响应带了 Content-Encoding: gzip 和合适的 Cache-Control,现代浏览器就会把压缩后的内容存进磁盘缓存,并在下次请求时直接复用(无需重传、无需重压)。
所以关键动作是:
- 开启 Gzip 或 Brotli 压缩(服务端生成压缩响应)
- 为这些响应设置长效
Cache-Control头(让浏览器敢缓存) - 确保
Vary: Accept-Encoding存在(避免缓存错乱)
✅ 配置 Gzip 压缩 + 缓存头(推荐基础组合)
在 http { } 块中添加:
gzip on;
gzip_vary on; # 必须!否则 CDN 或代理可能缓存错版本
gzip_min_length 1024; # 小于 1KB 的文本不压(避免负优化)
gzip_comp_level 6; # 平衡 CPU 与压缩率
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;然后,在 server 或 location 中为静态资源加缓存头:
# JS/CSS/字体等文本类资源:缓存 1 年,且允许公共缓存
location ~* \.(js|css|woff2|woff|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML 页面通常不长期缓存(或用协商缓存)
location ~* \.html$ {
expires 1h;
add_header Cache-Control "private, must-revalidate";
}⚠️ 注意:
immutable是关键——它告诉浏览器“此资源在过期前绝不会变”,可跳过If-None-Match协商,大幅提升复用效率(Chrome/Firefox 支持良好)。
✅ 如需支持 Brotli(比 Gzip 更优压缩率)
Nginx 原生不支持 Brotli,需编译安装 ngx_brotli 模块(官方 GitHub)。启用后配置类似:
brotli on;
brotli_comp_level 6;
brotli_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml;
# 仍需保留 gzip 作为 fallback(兼容老客户端)
gzip on;
gzip_vary on;
gzip_types ... ;
# 关键:Vary 必须同时覆盖两种编码
add_header Vary "Accept-Encoding";✅ 浏览器会按
Accept-Encoding优先级自动选br或gzip,Nginx 会分别响应,配合Vary头,CDN 和浏览器都能正确区分缓存。
✅ 验证是否生效
- 用 Chrome DevTools → Network 标签页打开一个
.js或.css文件 - 查看 Response Headers:
- 有
Content-Encoding: gzip或br - 有
Cache-Control: public, immutable或类似值 - 有
Vary: Accept-Encoding
- 有
- 刷新后查看 Size 列显示
(memory cache)或(disk cache),即表示命中成功
不复杂但容易忽略


















