关键是不改变用户访问url,只在nginx内部重写请求路径到新位置;需配置在匹配原始请求的location块中,推荐用last标志实现路径映射并联动try_files兜底。

用 rewrite 指令实现静态资源路径的平滑迁移与版本控制,关键是**不改变用户访问 URL,只在 Nginx 内部重写请求路径到新位置**。这样前端无需修改引用,CDN 缓存不受影响,页面不会因 404 报错而中断加载。
适用场景与前提条件
rewrite 必须配置在能匹配原始请求的 location 块中(如 /dist/、/static/v1/),且只作用于 URI 路径部分,不处理查询参数。常见迁移需求包括:
- 构建产物从
/dist/js/app.js移至根目录/js/app.js - 版本目录从
/static/v1/切换到/static/v2/,但 HTML 仍大量引用旧路径 - 统一去除冗余前缀,例如将所有
/legacy/css/请求内部映射到/css/
核心语法与 flag 选择
基本格式为:rewrite [flag];。静态资源迁移推荐使用 last 标志:
- last:内部重写后,Nginx 会用新 URI 重新匹配 location —— 适合路径映射,确保后续规则(如 try_files)仍生效
- break:停止当前 location 内 rewrite,不再重新匹配 —— 适合简单截断,但无法联动 alias 或 root
- redirect / permanent:触发 302 / 301 重定向 —— 会暴露路径变更、破坏缓存、增加延迟,静态资源迁移中应避免
示例:把所有 /dist/xxx 请求内部重写为 /xxx
rewrite ^/dist/(.*)$ /$1 last;
}
结合正则提取实现智能路径重构
当新旧路径存在结构差异(如哈希文件名、目录层级变化),需用正则捕获关键字段再重组:
- 旧路径含哈希:
/static/v1/js/app.a1b2c3d4.js→ 新路径去哈希:/assets/js/app.js - 可配置带命名捕获的 location,提取类型、主文件名和扩展名:
location ~ ^/static/v1/(js|css|img)/(.+)\.[a-f0-9]{8,}\.(js|css|png|jpg|gif)$ {
rewrite ^/static/v1/(js|css|img)/(.+)\.[a-f0-9]{8,}\.(js|css|png|jpg|gif)$ /assets/$1/$2.$3 last;
}
与 try_files 配合提供兜底保障
rewrite 是主动改写,try_files 是被动回退。两者互补可提升容错性:
- 先用 rewrite 尝试标准路径映射
- 若 rewrite 后仍找不到资源,可在同一 location 中接 try_files,回退查找旧路径或返回 404
- 示例:
location /dist/ {
rewrite ^/dist/(.*)$ /$1 last;
try_files $uri =404;
}
不复杂但容易忽略










