应选alias:当URL路径与磁盘目录名不一致时,alias可替换location匹配前缀,如/img/→/data/code_img/;选root则要求结构对齐,如/static/→/var/www/下必须存在static子目录。

图片加载 404,八成是 root 和 alias 混用了,或者配错了路径拼接逻辑。关键不是“哪个更好”,而是“哪个符合你的 URL 和磁盘结构关系”。
先看问题出在哪:root 会追加,alias 会替换
假设你想通过 http://example.com/img/1.png 访问服务器上 /data/code_img/1.png 这个文件:
- 用
root /data/code_img;+location /img/ { ... }→ Nginx 实际找的是/data/code_img/img/1.png(多了一层img/)→ 404 - 用
alias /data/code_img/;+location /img/ { ... }→ Nginx 实际找的是/data/code_img/1.png(把/img/整段替换了)→ 成功
什么时候该用 root
适合 URL 路径和磁盘目录结构完全对齐的场景:
- 整个站点静态资源放在
/var/www/dist/,想让/直接对应index.html:location / { root /var/www/dist; } - 图片都在
/var/www/static/images/,且 URL 就是/static/images/xxx.jpg:location /static/images/ { root /var/www; }(注意:root 值不带static/images) - root 值末尾加不加
/都行,Nginx 会自动处理,但建议统一写成/var/www/更清晰
什么时候该用 alias
适合 URL 路径和磁盘目录名不一致、需要“映射跳转”的场景:
- 磁盘路径是
/mnt/pics/,但你想用/img/这个 URL 访问:location /img/ { alias /mnt/pics/; }(alias 值必须以/结尾) - 挂载 Swagger UI 到
/api/docs/,而文件实际在/opt/swagger-ui/:location /api/docs/ { alias /opt/swagger-ui/; } - 子应用部署,比如把
/admin/映射到/srv/my-admin/,且希望/admin/index.html直接读/srv/my-admin/index.html
常见踩坑点
这些细节错一个,就 404:
-
alias值漏掉末尾/,比如写成alias /data/code_img;→ 请求/img/1.png会变成/data/code_img1.png(少斜杠,路径错) -
location写成/img(无结尾/),而alias是/data/code_img/→ 请求/img1.png会被误拼为/data/code_img1.png - 同一
location块里同时写root和alias→ Nginx 启动直接报错,不允许混用 - 用
root时没检查磁盘是否存在对应子目录,比如root /var/www;+location /static/→ 必须真实存在/var/www/static/才能访问其下文件


















