root是“追加”,alias是“替换”:root将完整URI(含location前缀)拼接到指定路径后,要求磁盘存在对应子目录;alias则先删除location匹配前缀,再将剩余路径拼到指定目录后,末尾必须带/且仅限location块使用。

核心就一句话:root 是“追加”,alias 是“替换”。不是写法不同,而是路径构造逻辑完全相反。
root:把整个请求路径原样贴到指定目录后面
它不关心 location 匹配了哪一段,而是把完整的 URI(包括 location 前缀)直接拼上去。
- 配置 location /admin/ { root /var/www/html; },访问 /admin/js/app.js → 查找路径是 /var/www/html/admin/js/app.js
- 磁盘里必须真有 admin/ 这个子目录,否则 404
- root 值末尾写不写 / 都行,Nginx 会自动补全,但统一写成 /var/www/html/ 更清晰
- 可出现在 http、server、location 任意层级,适用范围广
alias:先砍掉 location 匹配的部分,再把剩下的拼过去
它把 location 中写死的那段路径(比如 /admin/)整个抹掉,只留 URI 后半截,再接到 alias 目录后。
- 配置 location /admin/ { alias /var/www/admin/; },访问 /admin/js/app.js → 查找路径是 /var/www/admin/js/app.js
- 磁盘里根本不需要存在 /var/www/admin/admin/,/admin/ 这段被替换了,不是拼进去了
- alias 值末尾必须带 /,否则像 alias /var/www/admin 会导致错拼成 /var/www/adminjs/app.js
- 只能用在 location 块里,且不能和 root 混用在同一 location 中
location 写法直接影响结果
看似只是多一个斜杠,实际决定 Nginx 怎么切分“匹配前缀”和“剩余路径”。
- location /admin/:只匹配以 /admin/ 开头的请求,且能准确剥离这一整段
- location /admin:可能误匹配 /admin123,还容易让 alias 拼错位、root 多出一层
- 所有用于静态映射的 location,建议统一用 /xxx/ 格式
别被“性能”误导,关键在语义是否对得上
有人说 alias 能规避 root 的“二次寻址开销”,这是误解。两者最终都只做一次文件系统 open() 调用。区别不在快慢,而在路径能不能落到真实文件上。
- 用 root 却没建对应子目录 → 404
- 用 alias 却忘了末尾斜杠 → 路径错位 → 404
- 想挂载 Swagger UI 到 /api/docs/,但用 root → 找 /opt/swagger-ui/api/docs/index.html(不存在);用 alias → 找 /opt/swagger-ui/index.html(正确)


















