用 try_files 实现旧版静态资源平滑迁移,核心是让 nginx 在找不到新路径资源时自动回退到旧路径查找,不重定向、不断连、用户无感;需先明确新旧路径映射(如 /static/v1/ → /assets/),通过 location 配置 alias 与 try_files 按序查找 $uri 和 /assets/$uri,支持正则剥离哈希匹配新版文件,并通过定制日志追踪回退请求以渐进收敛。

用 try_files 实现旧版静态资源平滑迁移,核心是让 Nginx 在找不到新路径资源时,自动回退到旧路径查找,不暴露重定向、不中断请求,用户无感切换。
明确新旧资源路径映射关系
迁移前必须理清文件位置变化。例如:
- 旧资源在
/static/v1/,新版统一放在/assets/ - 但部分老 HTML、CSS 中仍引用
/static/v1/logo.png,不能立刻改源码 - 目标是:请求
/static/v1/logo.png时,Nginx 先查该路径,不存在则查/assets/logo.png
在 location 块中用 try_files 回退查找
针对旧静态路径配置专用 location,利用 try_files 按顺序尝试多个来源:
location /static/v1/ {
alias /var/www/new-site/assets/;
try_files $uri $uri/ /assets/$uri =404;
}
说明:
-
$uri对应实际磁盘路径(如/var/www/new-site/assets/logo.png) -
/assets/$uri是逻辑回退——把/static/v1/logo.png映射为/assets/logo.png -
=404表示所有路径都失败时直接返回 404,不触发内部重定向或 proxy_pass
处理带版本号或哈希的资源(如 /static/v1/js/app.a1b2.js)
若旧路径含哈希值,而新版已重命名,可借助正则提取文件名主体,再匹配新资源:
location ~ ^/static/v1/(js|css|img)/(.+)\.[a-f0-9]{8,}\.(js|css|png|jpg|gif)$ {
alias /var/www/new-site/assets/;
try_files $uri /assets/$1/$2.$3 =404;
}
这个规则会把 /static/v1/js/app.a1b2.js → 尝试 /assets/js/app.js,跳过哈希部分,适配现代构建工具输出。
配合日志与灰度验证,确保零遗漏
上线后通过 access_log 或自定义 log_format 记录被回退的请求:
log_format migration '$remote_addr - $request_uri → $status (via try_files)'; access_log /var/log/nginx/migration.log migration;
定期检查日志中哪些旧路径仍在被访问,针对性更新前端引用或补充新资源,逐步收敛回退路径。










