root是拼接(完整URI追加到目录后),要求磁盘存在对应子路径;alias是替换(剥离location前缀后拼接剩余URI),不依赖磁盘层级,且alias值末尾必须加/。

区分 root 和 alias 的路径映射差异,关键就看 Nginx 怎么处理 location 匹配的那一段 URL —— 是“保留拼上去”,还是“直接换掉”。
root:完整 URI 拼接到指定目录后
root 把请求的整个 URI(包括 location 前缀)原样追加到你写的路径后面。它要求磁盘上存在与 URL 层级完全一致的子目录结构。
- 配置:location /static/ { root /var/www; }
- 请求:/static/css/app.css
- 实际查找路径:/var/www/static/css/app.css(/static/ 被保留)
- 如果 /var/www 下没有 static/ 这个子目录,就会 404
- root 值末尾加不加 / 都可以,Nginx 会自动补全
alias:用指定路径替换 location 前缀
alias 会把 location 匹配的部分整个拿掉,只把剩下的 URI 路径拼到你给的路径后面。它不依赖磁盘中是否存在对应前缀目录,是真正的路径重定向。
- 配置:location /static/ { alias /opt/assets/; }(注意末尾必须有 /)
- 请求:/static/css/app.css
- 实际查找路径:/opt/assets/css/app.css(/static/ 被彻底剥离)
- alias 值末尾漏掉 /,比如写成 /opt/assets,会导致拼成 /opt/assetss/css/app.css —— 错误路径
- alias 只能在 location 块里用,不能出现在 server 或 http 级别
怎么选:看你的目录结构和 URL 是否对齐
如果 URL 路径和磁盘目录结构天然一致(比如前端 dist 目录直接部署为网站根),用 root 更自然;如果想把 /api/docs 映射到 /opt/swagger-ui,或把 /media 映射到独立挂载的 /mnt/media,那就必须用 alias。
- location / { root /var/www/site; } → 推荐,整站托管
- location /admin/ { alias /var/www/admin-dist/; } → 推荐,子应用非根部署
- location /static/ { root /var/www; } → 容易出错,除非你真有 /var/www/static/ 目录
常见踩坑点
- alias 写成 alias /opt/assets(缺末尾 /)→ 路径错位
- location 写成 location /static(没结尾 /)→ 可能匹配到 /static123,导致意外交替
- 在同一个 location 里同时写 root 和 alias → Nginx 启动失败
- 用 alias 配置 location / → 不推荐,逻辑反直觉,容易混乱


















