nginx路径拼接关键在于root是“补全”(完整uri拼接)、alias是“替换”(去除location前缀后拼接);root易导致多级冗余路径,alias适合非对称映射,二者不可混用且alias必须位于location块内、末尾通常需加斜杠。

关键在理解 Nginx 怎么拼路径:root 是“补全”,alias 是“替换”。用错一个,文件就找不到,404 很常见。
root 的行为:把整个请求 URI 拼到指定目录后面
location 匹配的路径 + 请求 URL 剩余部分,全部加到 root 路径末尾。
例如:
- 配置:location /static/ { root /var/www; }
- 请求:/static/css/app.css
- Nginx 实际查找:/var/www/static/css/app.css
注意:即使你只想让 /static/ 对应 /var/www 下的文件,root 也会硬把 /static/ 这段加进去。所以如果文件真在 /var/www/css/app.css,那这个配置就错了。
alias 的行为:用指定路径直接替换 location 匹配的部分
location 中匹配的前缀(比如 /static/)被完全去掉,只把 URL 剩余部分接在 alias 路径后。
例如:
- 配置:location /static/ { alias /var/www/assets/; }(注意结尾必须有 /)
- 请求:/static/css/app.css
- Nginx 实际查找:/var/www/assets/css/app.css
alias 更适合做“路径映射”——你想让某个 URL 前缀精准对应到某个独立目录,不带多余层级。
怎么选?看你的目录结构和访问意图
- 用 root:静态资源按 URL 路径自然分层,比如网站根目录下有 /css/、/js/、/images/ 子目录,且它们物理位置也保持同样结构
- 用 alias:需要把某段 URL 映射到一个“非对称”路径,比如把 /api-docs/ 指向 /opt/swagger-ui/,或把 /uploads/ 指向 /data/uploads/
- 别混用:同一个 location 里不能同时写 root 和 alias;alias 必须写在 location 块内,不能放在 server 或 http 层
容易踩的坑
- alias 后面必须带斜杠(如 alias /var/www/files/;),否则可能拼出错误路径甚至 404
- location 使用正则时,alias 需配合捕获组,比如 location ~ ^/img/(.+)\.png$ { alias /var/www/pics/$1.png; }
- root 可以写在 server 级,但 alias 不行——它只属于 location











