最稳妥做法是在location块中用expires指令配合文件后缀或路径精准匹配,并用add_header补充cache-control头;expires不可写在http或server根层级,必须嵌套在响应静态文件的location块内。

直接在 location 块里写 expires 指令,配合文件后缀或路径精准匹配,再补上 Cache-Control 头——这是最稳妥、最常用的做法。root 指令只管找文件,不参与缓存控制;真正起作用的是 expires 和 add_header 的组合。
必须放在 location 块中才生效
expires 不能写在 http 或 server 根层级,它必须嵌套在能实际响应静态文件的 location 块里。否则配置不会触发:
- 错误写法:
server { expires 1d; }—— 不命中任何请求,无效 - 正确写法:
location ~* \.(js|css|png|jpg|gif|woff2|svg)$ { expires 1y; } - 若静态资源统一放在
/static/目录下,更推荐前缀匹配:location ^~ /static/ { expires 1y; }(性能更高、无正则开销)
按资源类型分层设置过期时间
不同文件更新频率不同,缓存周期不能一刀切。关键看是否带哈希(如 app.a1b2c3.js):
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 带哈希的 JS/CSS/字体/图片:用
expires 1y;或expires max;,并加immutable - 普通图片、图标、未哈希字体:设
expires 30d;或expires 6m; - HTML、PHP、JSON 等动态内容:必须禁用长期缓存,用
expires epoch;或expires -1s;
一定要手动补充 Cache-Control 头
expires 指令只自动生成基础缓存头,现代浏览器更依赖 Cache-Control。add_header 必须和 expires 同级,且只能写一次(重复会覆盖):
- 指纹资源:
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, max-age=0";
验证是否真正生效
改完配置不能直接上线,要逐层确认:
- 先运行
nginx -t检查语法 - 再执行
nginx -s reload重载 - 用
curl -I https://your.site/style.css查看响应头,确认同时存在Cache-Control和Expires - 打开浏览器 Network 面板刷新资源,状态码为
304或显示from memory cache才算成功










