nginx中需按文件类型差异化设置expires:图片/字体等设1年,js/css设1个月,html等动态内容禁用缓存;推荐配合哈希命名与immutable实现强缓存+即时更新。

在 Nginx 中,expires 指令用于控制浏览器缓存行为,合理设置能显著降低重复请求、提升页面加载速度。但不同文件类型对缓存策略要求差异很大——静态资源(如图片、JS、CSS)适合长期缓存,而 HTML 页面通常需禁止缓存或极短缓存时间。下面通过实战配置说明如何按文件类型差异化设置 expires。
按后缀匹配设置 expires(最常用)
利用 location 块配合正则或精确后缀匹配,为不同资源指定缓存时长:
- 图片、字体、音视频等不变资源:设为 1 年,避免频繁请求
- JS/CSS 文件:建议 1 个月,兼顾稳定性与更新灵活性(配合版本号或哈希命名更佳)
- HTML、PHP、SSI 等动态内容:应禁用缓存,防止用户看到过期页面
示例配置:
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
<p>location ~* .(js|css)$ {
expires 1M;
add_header Cache-Control "public";
}</p><p>location ~* .(html|htm|php|shtml)$ {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}</p>
使用 map 指令实现更灵活的类型映射
当文件类型多、规则复杂时,map 可统一管理缓存时间,提升可读性和复用性:
map $sent_http_content_type $expires_time {
default "-1";
~*^text/html "-1";
~*^text/css "1M";
~*^application/javascript "1M";
~*^image/ "1y";
~*^font/ "1y";
~*^application/font- "1y";
}
然后在 server 或 location 中直接引用:
expires $expires_time;
注意:map 必须定义在 http 块中,且依赖 $sent_http_content_type ——即响应头中的 Content-Type,因此要确保后端正确返回该头。
配合版本号或哈希值实现“强缓存 + 即时更新”
仅靠 expires 无法解决资源更新问题。若 JS 文件缓存 1 个月,修改后用户可能仍加载旧版。推荐做法:
- 构建时给静态资源加哈希后缀(如
app.a1b2c3.js),文件名变化即触发新请求 - HTML 中通过构建工具注入最新链接,确保引用准确
- 此时可放心将 JS/CSS 的
expires设为 1 年,并添加immutable提升浏览器缓存效率
例如:
location ~* \.js$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
验证缓存是否生效
部署后务必验证实际响应头:
- 用
curl -I https://example.com/style.css查看Expires和Cache-Control - 在 Chrome DevTools 的 Network 标签页中检查资源的
Size列:显示from disk cache或from memory cache表示命中缓存 - 修改资源后清空浏览器缓存再测试,确认 HTML 不缓存、JS/CSS 缓存正常
注意:本地开发时浏览器可能因调试模式忽略缓存指令,建议用无痕窗口或禁用缓存选项测试真实行为。











