root是拼接、alias是替换:root将完整URI加在指定路径后,如location /static/ { root /var/www; }访问/static/css/app.css对应/var/www/static/css/app.css;alias则删除location匹配前缀后再拼接,如location /static/ { alias /var/www/assets/; }对应/var/www/assets/css/app.css。

关键在理解 root 是“拼接”,alias 是“替换”——选错一个,文件就找不到。
root 指令:原样拼接整个请求路径
root 把请求的完整 URI(包括 location 匹配到的部分)直接加在指定路径后面。它不删减、不截断,只是连接。
- 配置
location /static/ { root /var/www; },访问/static/css/app.css,Nginx 实际查找:/var/www/static/css/app.css - 也就是说,
/static/这个前缀会出现在磁盘路径里,所以 root 后的目录通常不应再包含该子路径 - 适合整站托管或资源结构天然与 URL 层级一致的场景,比如
location / { root /var/www/html; } - root 值末尾加不加
/都能工作,但建议统一加,避免和 alias 混淆
alias 指令:精准替换 location 匹配部分
alias 会把 location 中写明的匹配前缀(如 /static/)整个去掉,只把剩余路径拼到 alias 指定的目录后。
- 配置
location /static/ { alias /var/www/assets/; },访问/static/css/app.css,Nginx 实际查找:/var/www/assets/css/app.css - alias 值**必须以
/结尾**(指向目录时),否则可能因路径拼接出错;location 的末尾斜杠也要与之风格一致 - 不能用于正则 location(除非用命名捕获并显式引用,需谨慎)
- 适合子应用部署、CDN 回源、前端路由 fallback 等需要“抹掉 URL 前缀”的场景
怎么选?看 URL 是否该出现在文件路径里
判断逻辑很直接:
- 如果请求路径本身就应该对应磁盘上的子目录(比如
/images/下真有 images 文件夹),用 root - 如果只是把某个 URL 前缀“映射过去”,不希望它出现在物理路径中(比如
/admin/要指向独立构建的 Vue 项目目录),必须用 alias - Vue、React 等 SPA 非根部署时,99% 应该用 alias,否则资源路径会多套一层前缀导致 404
常见错误与排查建议
404 却确认文件存在?别猜,看日志:
- 检查 Nginx
error.log,里面会明确写出它尝试访问的完整文件路径 - 误把
root /data;和location /img { ... }配在一起,结果去找/data/img/logo.png,而你本意是/data/logo.png——这时该换 alias - alias 值漏了末尾
/,比如写成alias /var/www/assets,可能导致路径变成/var/www/assetscss/app.css(缺少分隔符) - root 和 alias 混用在同一 location 块中会报错,二者互斥











