Nginx 用 alias 实现多版本静态资源并存,需为各版本配置独立路径前缀(如 /v1/、/v2/)并用 ^~ + alias 精准映射到物理隔离目录,末尾斜杠不可省;配合软链接实现零停机更新,并可选 map 动态路由与差异化缓存策略。

在 Nginx 中用 alias 实现多版本静态资源并存,关键不是“多个 alias 指向同一目录”,而是为每个版本分配独立路径前缀(如 /v1/、/v2/),再通过 alias 精准映射到物理隔离的版本目录。这样浏览器缓存、CDN 缓存和 Nginx 本地行为天然互不干扰。
用 ^~ + alias 映射各版本路径
每个版本使用带版本号的 URL 前缀,并用 ^~ 保证最长前缀优先匹配,避免被正则 location 覆盖:
location ^~ /v1/ { alias /var/www/app/releases/v1.5.0/; }location ^~ /v2/ { alias /var/www/app/releases/v2.1.0/; }location ^~ /beta/ { alias /var/www/app/releases/beta-20260825/; }
注意:alias 值末尾必须带斜杠(/),否则路径拼接会出错;请求 /v1/js/app.js 将准确读取 /var/www/app/releases/v1.5.0/js/app.js。
配合软链接实现零停机更新
不要直接覆盖文件,而是让版本目录实际指向带时间戳或哈希的构建产物,并用符号链接统一入口:
- 构建产出:/var/www/app/releases/20260825-v1/、/var/www/app/releases/20260825-v2/
- 建立软链:
ln -sf /var/www/app/releases/20260825-v1 /var/www/app/v1-latest - 配置中改为:
location ^~ /v1/ { alias /var/www/app/v1-latest/; }
上线时只更新软链目标,旧版本资源仍可访问,已有缓存继续生效,新请求自动命中新版目录。
按客户端特征动态选择版本(可选)
若需灰度发布或 A/B 测试,可用 map 指令将请求头、Cookie 或 User-Agent 映射为路径变量:
- 在
http块中定义:map $http_x_version $version_path { "v2" "/var/www/app/releases/v2.1.0/"; default "/var/www/app/releases/v1.5.0/"; } - 在
location /static/中:alias $version_path/; - 搭配
Vary: X-Version响应头,确保 CDN 和浏览器按请求头区分缓存
缓存策略按版本差异化设置
每个 location 块内可独立配置缓存,适配不同版本的更新节奏:
- 对
/v1/static/设置长期缓存:expires 1y; add_header Cache-Control "public, immutable"; - 对
/v1/index.html禁用缓存:location ~ ^/v1/index\.html$ { add_header Cache-Control "no-cache, no-store"; } - 对
/beta/全部设短缓存:expires 5m;
不同版本的 URL 完全独立,缓存键(URL)天然隔离,无需额外清理逻辑。


















