Nginx静态资源缓存需精准匹配路径、差异化设置过期策略并补全Cache-Control头:带哈希文件用expires 1y+immutable,图片用30d,动态内容设expires epoch+no-cache,配置后须用curl和浏览器验证响应头。

在 Linux 系统的 Nginx 配置中设置静态资源缓存过期时间,核心是让浏览器知道哪些文件能缓存、缓多久、是否允许复用。这不是“让请求过期”,而是通过响应头控制客户端行为,关键在于匹配准、分得清、头写对、验得到。
精准匹配静态资源路径
避免泛匹配误伤动态内容,必须用明确规则定位静态文件:
- 用~*正则匹配常见后缀(忽略大小写),覆盖主流类型:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|webp)$ { ... } - 若静态资源统一放在
/assets/或/static/目录下,优先用^~前缀匹配,性能更高且无正则开销:location ^~ /assets/ { ... } - 绝对不要在
location /或location ~ \.html$里加expires,否则 HTML 或接口可能被强缓存,导致用户看到陈旧页面
按资源稳定性设差异化过期策略
缓存时长取决于文件名是否含内容哈希(如app.a1b2c3.js),而非单纯看后缀:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
带哈希的 JS/CSS/字体/WebP:内容不变 URL 就不变,可长期缓存
expires 1y;add_header Cache-Control "public, immutable, max-age=31536000"; -
图片、图标、SVG 等稳定但无哈希的资源(如
logo.png):expires 30d;add_header Cache-Control "public, max-age=2592000"; -
未版本化的通用资源(如
config.json、theme.css):expires 1h;或expires 1d;,降低更新延迟风险 -
HTML、PHP、JSON 接口等动态内容:
expires epoch;或expires -1;add_header Cache-Control "no-cache, must-revalidate, max-age=0";
必须补全并合并 Cache-Control 响应头
expires只生成基础头,现代浏览器更依赖Cache-Control,且需语义完整:
-
immutable是关键——它告诉浏览器“该资源永远不会变”,F5 刷新也不发条件请求(如If-None-Match),大幅提升重复访问性能 -
add_header在同一作用域内多次声明会覆盖,务必把所有指令合并成一条,例如:add_header Cache-Control "public, immutable, max-age=31536000";,而不是分开写 - 确保
max-age值与expires时间逻辑一致(如1y ≈ 31536000秒)
配置后必须验证是否生效
改完不能直接上线,要确认响应头真实发出并被识别:
- 先运行
nginx -t检查语法是否正确 - 再执行
nginx -s reload重载配置 - 用
curl -I https://your.site/style.css查看响应头,确认同时存在Expires和Cache-Control - 打开浏览器开发者工具 → Network → 刷新资源,观察状态码是否为
304(协商缓存)或直接显示from memory cache/from disk cache - 若没生效,排查:location 是否命中、root/alias 路径是否正确、静态文件是否真由 Nginx 直接提供(而非后端返回)

















