alias 指令完全替换 location 匹配部分,而 root 是拼接;alias 值末尾斜杠必须与 location 一致,正则中需用 $1 等捕获组,配合 rewrite 时须用 break,root + rewrite 更适合前缀剥离。

Nginx 中的 alias 指令用于将 location 匹配到的 URI 映射到文件系统上的另一个路径,它和 root 的行为有本质区别:alias 会**完全替换**匹配的部分,而 root 是拼接。要结合路径重写(比如去掉前缀、调整目录结构),关键在于理解 alias 的“替换逻辑”并谨慎处理 trailing slash 和正则捕获。
alias 的基本写法与易错点
假设你想把访问 /static/logo.png 映射到服务器上 /var/www/assets/images/logo.png:
- 错误写法(用 root):
location /static/ { root /var/www/assets/images; }
→ 实际查找路径是/var/www/assets/images/static/logo.png(多了一级 static) - 正确写法(用 alias):
location /static/ { alias /var/www/assets/images/; }
→ 请求 /static/logo.png → 映射为 /var/www/assets/images/logo.png
注意:alias 值末尾的 / 很关键。location 末尾有 /,alias 值也必须有 /;否则路径拼接会出错(如 alias /var/www/assets/images 不加斜杠,/static/logo.png 会被映射成 /var/www/assets/imageslogo.png)。
用正则 location + alias 实现动态路径重写
当需要更灵活的重写(比如把 /cdn/v1/img/xxx.jpg 映射到 /opt/cdn/images/xxx.jpg),可借助正则捕获 + alias:
location ~ ^/cdn/v\d+/img/(.+)$ {
alias /opt/cdn/images/$1;
}
说明:
-
^/cdn/v\d+/img/(.+)$捕获 img/ 后面的完整文件路径(含子目录) -
alias /opt/cdn/images/$1直接把捕获内容拼到目标根目录后 - 访问
/cdn/v1/img/icons/arrow.svg→ 映射到/opt/cdn/images/icons/arrow.svg
重要限制:alias 不支持在正则 location 中使用 <p><strong>重要限制</strong>:alias 不支持在正则 location 中使用 <code>$0 或未命名捕获组的完整匹配;必须用带括号的捕获($1, $2)明确指定要保留的部分。
, )明确指定要保留的部分。alias 配合 rewrite 做预处理(慎用)
虽然 alias 本身不支持 rewrite 后再生效(rewrite 改变 URI,但 alias 是基于原始匹配计算的),但你可以用 rewrite + break 实现等效效果:
location /old-static/ {
rewrite ^/old-static/(.*)$ /new-static/$1 break;
alias /var/www/public/;
}
这样访问 /old-static/css/app.css 先被重写为 /new-static/css/app.css,再由 alias 映射为 /var/www/public/new-static/css/app.css。但注意:
– 必须用 break(不是 redirect 或 last),否则会重新匹配 location;
– alias 路径仍按重写后的 URI 计算,所以这里实际映射的是 /var/www/public/ 下的 new-static/... 子路径。
替代方案:用 root + rewrite 更清晰?
如果逻辑复杂、容易混淆,推荐优先考虑 root + rewrite:
location /cdn/ {
rewrite ^/cdn/(.*)$ /$1 break;
root /opt/cdn/files;
}
访问 /cdn/js/main.js → 重写为 /js/main.js → root 拼接为 /opt/cdn/files/js/main.js。这种方式语义更直白,尤其适合前缀剥离类需求。
alias 适合“URI 路径和磁盘路径无直接层级对应”的场景;root + rewrite 更适合“保持层级关系,只调整入口前缀”的情况。











