用expires指令控制缓存需按类型精准匹配、设合理时长并配合cache-control头:js/css按哈希设1h或1y,图片30d,字体1y,html禁用缓存,必须add_header补充public/immutable/max-age,配置后验证响应头及缓存状态。

用 expires 指令控制浏览器缓存,核心是“按类型匹配 + 合理设时长 + 配合现代头”,不是简单加个时间就完事。
按文件后缀精准匹配资源
在 location 块中用正则匹配静态资源,避免误伤 HTML 或 API:
location ~* \.(js|css)$ { expires 1h; add_header Cache-Control "public"; }location ~* \.(jpg|png|gif|webp)$ { expires 30d; add_header Cache-Control "public, immutable"; }location ~* \.(woff2|ttf|eot|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }location ~* \.html$ { expires epoch; add_header Cache-Control "no-cache, must-revalidate"; }
注意 ~* 表示大小写不敏感;epoch 表示立即过期,适合 HTML 入口页。
不同资源设不同有效期
缓存时间要贴合实际更新节奏:
- CSS/JS 若带内容哈希(如
app.a1b2c3.js),可放心设expires 1y - 若无哈希、常随发布更新,建议
expires 1h或1d,降低旧版本残留风险 - 用户头像、上传图片等动态图,应禁用强缓存:
expires -1s或max-age=0 - 字体、SVG 图标等极少变更的资源,
1y合理且安全
必须搭配 Cache-Control 使用
expires 是 HTTP/1.0 兼容字段,依赖客户端本地时间,有偏差风险。现代浏览器优先认 Cache-Control:
- 始终用
add_header Cache-Control补充max-age(相对时间,更可靠) - 对带哈希的资源,加上
immutable,告诉浏览器“内容永不变”,跳过刷新时的条件请求 - 示例:
add_header Cache-Control "public, immutable, max-age=31536000";
验证是否真正生效
配置后不验证 = 白配:
- 先运行
sudo nginx -t检查语法,再sudo systemctl reload nginx(别用 restart) - 打开浏览器开发者工具 → Network → 找一个 JS 或图片,看响应头中
Expires和Cache-Control是否符合预期 - 刷新页面,状态码显示
200 (from memory cache)或304 Not Modified才算成功











