选 root 还是 alias,关键看 URL 路径和磁盘目录是否“名字对得上”:对得上用 root(全量拼接,要求磁盘存在对应子目录),对不上必须用 alias(前缀替换,不依赖磁盘层级,且 alias 值末尾必须加/)。

选 root 还是 alias,关键看 URL 路径和磁盘目录是否“名字对得上”。对得上,用 root 更直白;对不上,必须用 alias。
root 适合:URI 路径 = 磁盘子目录名
root 把整个请求 URI(包括 location 匹配部分)直接拼到指定路径后面。所以它要求磁盘上真有那个子目录。
- 配置:location /static/ { root /var/www; }
- 请求:
/static/js/main.js - 实际找的文件:
/var/www/static/js/main.js(注意 /static/ 出现在路径里) - 前提:/var/www 下必须存在 static 这个子目录
alias 适合:URL 和磁盘路径名称不一致
alias 会把 location 匹配的部分整个去掉,只把剩余 URI 拼到指定路径后。它不关心磁盘上有没有同名目录。
- 配置:location /cdn/ { alias /srv/fastly/assets/; }(注意结尾必须有 /)
- 请求:
/cdn/logo.png - 实际找的文件:
/srv/fastly/assets/logo.png(/cdn/ 被完全替换掉) - 优势:可把 /api-docs 映射到 /var/www/swagger/,名字完全无关也没问题
常见误用与避坑点
这两个指令看起来像,但错一点就 404 或返回错误文件。
-
alias 路径末尾必须加 /:写成
alias /var/www/assets(缺/),请求 /static/a.css 就会变成 /var/www/assetssa.css —— 少了斜杠,路径粘连出错 - location / 不要用 alias:匹配所有请求时,alias 无法安全替换空字符串,容易引发路径越界或 index 文件失效,此时 root 是唯一合理选择
-
正则 location 中用 alias 要捕获:比如
location ~ ^/user/(\d+)/avatar$,alias 必须引用 $1,如alias /data/avatars/$1;
一句话决策指南
打开你的目录结构和 URL 规划表:
- 如果
https://site.com/images/对应服务器上的/var/www/images/→ 用 root /var/www - 如果
https://site.com/images/实际来自/opt/media/uploads/→ 用 alias /opt/media/uploads/ - 多个子路径映射到同一物理目录不同子集(如 /css/、/js/ 都指向 /dist/)→ alias 更清晰可控


















