Nginx可通过map+location+alias实现多版本静态资源共存:用map按Host/请求头映射$env_root,location中用alias精准剥离前缀(如/v1/assets/→$env_root/v1/assets/),配合^~优先匹配和符号链接实现零停机更新。

不能靠 root 指令“自动切换版本”,但可以通过 location 分层 + 变量映射 + alias 精准剥离前缀,实现多版本静态资源共存且互不干扰。
用 map 定义环境与路径的映射关系
在 http 块中用 map 指令根据请求特征(如 Host、请求头或 URI 参数)生成动态变量,避免硬编码或 if 判断:
- 例如按域名区分:dev.example.com → $env_root = /var/www/app/dev/;prod.example.com → $env_root = /var/www/app/prod/
- 也可按请求头 X-Env: staging → 映射到 /var/www/app/staging/
- map 值必须是合法文件系统路径,且所有分支都要覆盖,否则未匹配时变量为空,导致 404
在 location 中引用变量作为 root 或 alias 的值
server 块内不再设固定 root,而是让每个关键 location 显式使用 $env_root:
- 对于根路径或通用静态资源,用 location / { root $env_root; } —— 此时 /index.html 对应 $env_root/index.html
- 对于带版本前缀的路径(如 /v1/assets/),推荐用 alias 避免重复拼接:
location /v1/assets/ { alias $env_root/v1/assets/; }
这样 /v1/assets/logo.png 直接落到 $env_root/v1/assets/logo.png,不会多出一层 v1/assets - 若用 root /v1/assets/ { root $env_root; },则请求会拼成 $env_root/v1/assets/v1/assets/logo.png,明显错误
为不同版本设置独立 location 块并控制匹配优先级
利用 Nginx 最长前缀匹配规则,把高优先级(精确、带版本号)的 location 放在前面:
- location ^~ /v2/ { alias $env_root/v2/; } → 所有以 /v2/ 开头的请求走 v2 目录
- location ^~ /v1/ { alias $env_root/v1/; } → 次之
- location / { root $env_root/latest/; } → 默认兜底,指向 latest 符号链接或当前稳定版
- 注意:正则 location(~ 或 ~*)优先级低于 ^~,所以版本路径尽量用 ^~ 前缀匹配,确保可控
配合符号链接或构建脚本实现零停机更新
root 和 alias 引用的路径可以是符号链接,实际指向具体版本目录:
- /var/www/app/latest → 指向 /var/www/app/releases/20260425/
- 上线新版本时,只需原子性地切换符号链接,Nginx 不需 reload
- 同时保留 /var/www/app/releases/20260420/、/20260425/ 等历史目录,供 /v1/、/v2/ 等 location 显式引用
- 这样既满足 URL 路径可见版本号,又避免每次发布改配置










