root是“原样拼接”,将完整URI追加到指定路径后;alias是“精准替换”,去掉location匹配部分后再拼接剩余URI。root要求目录下存在对应子目录,alias路径结尾必须带“/”。

root 和 alias 看似都能把 URL 映射到文件系统,但它们处理路径的方式截然不同——不是“怎么写更顺手”,而是“拼接逻辑根本相反”。搞错一个字符,Nginx 就会去错地方找文件,404 就是必然结果。
root 是“原样拼接”:URI 全部加在指定目录后面
root 把整个请求 URI(包括 location 匹配的部分)直接追加到你写的路径末尾。
比如配置:
location /static/ {root /var/www;
}
当用户访问 /static/css/app.css 时,Nginx 实际查找:
/var/www/static/css/app.css
注意:/static/ 这段被完整保留并拼进去了。所以 /var/www 目录下必须真实存在 static/ 子目录,否则 404。
✅ 适合场景:
- 整站部署,如
location / { root /var/www/html; },所有请求按结构自然落盘 - 静态资源目录与 URL 路径严格一致,比如前端构建产物直接扔进
/var/www/html/static/ - 配合
index或try_files做常规站点托管
alias 是“精准替换”:删掉匹配部分,只拼剩余 URI
alias 会把 location 中写的那部分路径(比如 /static/)整个拿掉,再把剩下部分(比如 css/app.css)接到你给的 alias 路径后面。
比如配置:
location /static/ {alias /opt/assets/;
}
同样请求 /static/css/app.css,Nginx 查找的是:
/opt/assets/css/app.css
关键点:/static/ 消失了,它没被拼进去,而是被替换了。
⚠️ 必须注意:
- alias 后的路径结尾必须带 /,写成
alias /opt/assets会导致/static/test.txt变成/opt/assetstest.txt,直接 404 - 不能用在正则 location 里(如
location ~ \.js$),老版本 Nginx 会报错,新版本虽支持但极易出错 - 常见用途:API 静态响应、独立资源池映射(如把
/api/docs指向/var/www/swagger/)
一句话判断该用谁
问自己一个问题:你希望 URL 中的 /xxx/ 这段,在磁盘路径里出现还是不出现?
→ 出现?用 root(例如网站根目录结构和 URL 完全对应)
→ 不出现?用 alias(例如把 /media/ 映射到完全无关的 /srv/uploads/)
混淆常发生在带前缀的 location 块中。比如想把 /backend/ 指向 /opt/myapp/dist/,如果误用 root,Nginx 就会去找 /opt/myapp/dist/backend/ —— 而那里根本没这个子目录。
典型错误与修复对照
❌ 错误配置(导致 404):
location /api/ {root /opt/backend;
}
→ 请求
/api/v1/data.json 查找 /opt/backend/api/v1/data.json(但 /api/ 子目录不存在)
✅ 正确写法:
location /api/ {alias /opt/backend/;
}
→ 同样请求查的是
/opt/backend/v1/data.json
❌ 另一个错误(403 或 404):
location /files {alias /data/shared;
}
→ 缺少结尾斜杠,
/files/report.pdf 变成 /data/sharedreport.pdf
✅ 修正后:
location /files/ {alias /data/shared/;
}

















