核心是静态资源走强缓存、HTML等强制校验:用^~精准拦截/_next/static/等目录,再以正则统一设置js/css等1年immutable缓存;html和favicon需禁用强缓存;兜底location /放最后并仅用try_files。

核心是让带哈希的 JS/CSS/图片等资源走强缓存,HTML 和关键入口文件强制校验,同时确保路径匹配不冲突、不漏判。
用 ^~ 精准拦截静态资源目录
对 Next.js、Vue CLI 或 Vite 构建产物中明确的静态路径(如 /_next/static/、/assets/、/static/),必须用 ^~ 修饰符:
- 它一匹配就终止后续所有正则检查,避免被后置的
~* \.js$规则干扰 - 优先级高于普通前缀和正则,且遵循“最长前缀”原则,适合结构稳定的构建输出
- 示例:
location ^~ /_next/static/ { root /var/www/app; expires 1y; add_header Cache-Control "public, immutable"; }
按文件类型统一设置强缓存策略
针对已带内容哈希的资源(如 main.a1b2c3.js、logo.d4e5f6.png),用不区分大小写的正则批量控制:
- 放在
^~块之后、location /之前,确保不被兜底规则覆盖 - 缓存时间设为 1 年,并添加
immutable,告诉浏览器无需发起条件请求 - 示例:
location ~* \.(js|css|png|jpg|jpeg|gif|webp|woff2|ttf|eot|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }
HTML 和无哈希资源必须禁用强缓存
单页应用的 HTML 是客户端路由入口,必须每次检查更新;favicon.ico 等无哈希资源也需谨慎缓存:
location ~* \.html$ { expires -1; add_header Cache-Control "no-cache, no-store, must-revalidate"; }location = /favicon.ico { alias /var/www/app/favicon.ico; expires 1h; log_not_found off; }- 避免用
root+try_files处理 HTML,应直接响应,防止 fallback 引入延迟
兜底路由必须放最后,且启用 try_files
客户端路由依赖服务端将未命中文件的请求回退到 index.html,这个逻辑不能被前面的规则截断:
location / { root /var/www/app; try_files $uri $uri/ /index.html; }- 该块必须位于所有
=、^~、~*规则之后 - 不要在它内部再写
expires或proxy_pass,否则会覆盖静态资源响应逻辑

















