nginx静态资源缓存需按类型精准配置:用~*匹配后缀、^~匹配静态目录,禁用location /或.html泛匹配;带哈希资源设expires 1y+immutable,图片字体设30d,未版本化资源设1h~1d,html和api设expires epoch+no-cache;务必用add_header补全cache-control,且合并声明;配置后须nginx -t验证并curl -i检查响应头。

直接在 location 块中用 expires 指令即可设置静态文件的浏览器缓存过期时间,关键是要按资源类型区分配置,避免误缓存 HTML 或接口响应。
匹配静态资源的 location 规则
优先使用高效、安全的匹配方式,不干扰动态请求:
- 用
~*不区分大小写正则匹配后缀,覆盖主流静态资源:location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|webp)$ { ... } - 用
^~前缀匹配固定静态目录,如/static/或/assets/,性能更高:location ^~ /static/ { ... } - 绝对不要把
expires放在location /或泛用location ~ \.html$下,否则可能缓存 HTML 页面或 API 返回
为不同资源设合理过期时间
过期策略要匹配资源是否带版本标识(如内容哈希):
- 带哈希的 JS/CSS(如
app.a1b2c3.js):用expires 1y;或expires max;,配合immutable - 图片、字体、SVG 等稳定静态资源:用
expires 30d;或expires 6m; - 未做版本控制的资源(如
logo.png、common.css):建议expires 1h;~expires 1d;,降低更新延迟风险 - HTML 页面和动态接口:统一设为
expires epoch;(等效于禁用强缓存)
必须配合 add_header 补充 Cache-Control
expires 仅生成 Expires 和基础 Cache-Control: max-age=xxx,但现代浏览器更依赖 Cache-Control,且需增强语义:
- 对带哈希的资源,加
add_header Cache-Control "public, immutable, max-age=31536000"; - 对普通图片,加
add_header Cache-Control "public, max-age=2592000"; - 对 HTML,加
add_header Cache-Control "no-cache, must-revalidate"; - 注意:
add_header同级多次声明会覆盖,应合并成一条
验证与常见问题
改完配置别跳过验证步骤:
- 先执行
nginx -t检查语法,再nginx -s reload重载 - 用
curl -I http://localhost/style.css查看响应头,确认同时存在Expires和Cache-Control - 若没生效,检查是否被
proxy_pass上游覆盖、location 是否命中、或静态文件实际由后端而非 Nginx 直接提供 - 缓存更新靠 URL 变化(如哈希名),不是靠刷新页面或清本地缓存——这点最容易被忽略











