Next.js静态资源需强制缓存,因其\_next/static下哈希文件内容不变,但默认响应头可能为no-store,导致CDN/浏览器反复回源;Nginx需用proxy_ignore_headers丢弃后端头,再用expires和add_header设强缓存。

为什么 Next.js 静态资源需要强制缓存
Next.js 在 _next/static 目录下生成带哈希的 JS/CSS 文件(如 main-abc123.js),这类资源天然具备内容不变性。但默认情况下,Nginx 不会主动覆盖上游响应头中的 Cache-Control 或 Expires,而 Next.js 开发/生产服务器(如 next start)可能返回 Cache-Control: no-store 或宽松策略,导致 CDN 或浏览器反复回源,拖慢首屏加载。
proxy_ignore_headers 的作用与典型误用
proxy_ignore_headers 并不“修改”响应头,而是让 Nginx **完全忽略**后端返回的指定头部,转而由 Nginx 自己通过 add_header 或 expires 指令设置缓存策略。常见误区是以为它能“覆盖”或“重写”,实际是“丢弃后重建”。对静态资源路径生效前,必须确保 location 匹配精确、且 proxy_pass 正确指向 Next.js 服务。
推荐 Nginx 配置片段(含缓存控制)
以下配置针对 /_next/static/ 和 /static/ 路径启用强缓存:
location ^~ /_next/static/ {
proxy_pass http://localhost:3000;
proxy_ignore_headers Cache-Control Expires Set-Cookie;
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
access_log off;
}
location ^~ /static/ {
alias /path/to/your/nextjs/public/static/;
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
}
-
使用
^~前缀确保前缀匹配优先于正则,避免被其他 location 覆盖 -
静态文件建议走
alias而非proxy_pass,零网络转发、更高性能 -
添加
immutable提示浏览器不验证缓存(适用于哈希文件),减少条件请求 -
access_log off降低 I/O 压力,这类资源访问量大但无需逐条记录
验证是否生效的关键检查点
部署后务必验证响应头是否符合预期:
- 用
curl -I https://yoursite.com/_next/static/chunks/main-abc123.js查看返回头 - 确认没有
Cache-Control: no-store或Set-Cookie等被忽略的头残留 - 确认存在
Cache-Control: public, immutable, max-age=31536000和Expires时间戳 - 打开浏览器开发者工具 → Network → 刷新资源,检查 Size 列是否显示
from disk cache或from memory cache










