alias指令本质是路径前缀替换:先截去location匹配的完整前缀,再将剩余uri拼接到alias值后,例如请求/static/js/app.js经location /static/ { alias /var/www/assets/; }处理后,得文件路径/var/www/assets/js/app.js。

Nginx 的 alias 指令本质是做URL 路径前缀的精确替换,不是拼接,也不是重写。它把 location 匹配到的部分“整个去掉”,再把剩下的 URI 路径直接拼到 alias 后面——这个逻辑决定了 URL 和文件系统路径怎么对应。
alias 是怎么算出最终文件路径的?
举个最典型的例子:
location /static/ {
alias /var/www/assets/;
}
- 请求
/static/js/app.js - Nginx 先匹配
location /static/,确认命中 - 然后截掉匹配的
/static/这段前缀,剩下js/app.js - 再把这个剩余部分直接拼到
alias值末尾:/var/www/assets/+js/app.js→/var/www/assets/js/app.js
✅ 关键就在这一步:去掉 location 前缀,只拼剩余路径
location 和 alias 的斜杠必须对齐
斜杠不一致,会导致路径粘连或错位,90% 的 404 都出在这里:
-
location /static/(结尾有/)→alias必须也以/结尾:alias /var/www/assets/; -
location /api(无/)→alias不该加/:alias /opt/backend;(指向单个目录或文件时可不带/)
常见错误:
- ❌
location /static/ { alias /var/www/assets; }
→ 请求/static/logo.png会找/var/www/assetslogo.png(缺/,路径粘连) - ✅ 正确写法统一用斜杠:
alias /var/www/assets/;
和 root 的区别,一眼看懂
| 请求 URL | location 配置 | root 行为(拼接) | alias 行为(替换) |
|---|---|---|---|
/static/css/a.css |
location /static/ { ... } |
root /var/www → /var/www/static/css/a.css
|
alias /var/www/assets/ → /var/www/assets/css/a.css
|
-
root:保留/static/,追加到根路径后 -
alias:删掉/static/,只留后面部分拼过去
所以,想让 URL 路径结构不反映在磁盘路径里,就用 alias;想让 URL 和磁盘目录严格一一对应,就用 root。
动态路径也能用 alias,但要配合正则捕获
比如按版本号映射:
location ~ ^/v(?<ver>[0-9]+\.[0-9]+)/(.*)$ {
alias /opt/app/releases/$ver/$2;
}</ver>
- 请求
/v1.5/js/main.js - 正则捕获
$ver = 1.5,$2 = js/main.js - 最终路径:
/opt/app/releases/1.5/js/main.js
⚠️ 注意:alias 值里可以含命名捕获变量(如 $ver、 $2),但不能含 $uri 或 $request_uri 这类完整 URI 变量,Nginx 不支持运行时拼接完整路径。
特殊字符路径怎么处理?
- 文件系统路径里有空格、中文、括号等,直接写原样,用双引号包裹更稳妥:
alias "/data/my site/中文资源/";
- 客户端请求自动 URL 编码(如
我的图片.jpg→%E6%88%91%E7%9A%84%E5%9B%BE%E7%89%87.jpg) - Nginx 内部自动解码后再拼接,你不需要、也不应该手动 rewrite 或 unescape
只要路径真实存在、权限正确,就能正常访问。
不复杂但容易忽略











