root 拼接完整 URI 路径,要求磁盘存在对应层级;alias 替换 location 前缀,只拼接剩余 URI,末尾必须加 /;正则 alias 需 Nginx 1.11.5+ 支持捕获变量;漏 /、路径冗余、权限不足是 404 主因。

处理多级子目录下的静态文件访问,关键不在“能不能”,而在于选对指令、写对路径——root 是拼接,alias 是替换。用错一个,404 就跟着来。
root 适合结构一致的整站或子路径
它把整个请求 URI(含 location 前缀)直接追加到 root 路径后面,所以磁盘上必须真实存在对应层级。
- 例如:location /project/v2.1.0/ { root /srv/static; } → 请求 /project/v2.1.0/js/app.js 会去找 /srv/static/project/v2.1.0/js/app.js
- 要求 /srv/static/project/v2.1.0/ 这个完整路径在磁盘上存在,缺一级就 404
- root 值末尾加不加 / 都行,Nginx 会自动补,但统一写成 /srv/static/ 更稳妥
alias 专治路径不一致或跨目录映射
它会把 location 匹配的部分完全去掉,只把剩余 URI 拼到 alias 路径后,不依赖磁盘上的前缀目录。
- 例如:location /static/css/ { alias /data/assets/css/; } → 请求 /static/css/app.css 实际读取 /data/assets/css/app.css
- alias 值末尾必须带 /,否则 /data/assets/css 会被错误拼成 /data/assets/cssapp.css
- location 也建议以 / 结尾(如 /static/css/),避免正则或截断歧义
正则匹配多级子模块(alias + 捕获)
想统一处理 /static/js/、/static/img/、/static/css/,又不想写一堆 location,可以用带捕获的正则:
- location ~ ^/static/(js|css|img)/(.*)$ { alias /data/assets/$1/$2; }
- 请求 /static/js/lib/vue.min.js → 映射为 /data/assets/js/lib/vue.min.js
- 注意:Nginx 1.11.5+ 才支持在 alias 中引用捕获变量,旧版本需改用 root + rewrite 或拆成多个 location
常见陷阱与硬性细节
- alias 后路径漏掉末尾 /,是 404 最高频原因
- root 配合 location /static/ 时,别写成 root /data/assets/static;——这会让 Nginx 拼出 /data/assets/static/static/xxx
- 启用 autoindex on 查目录?先确认 Nginx 用户(如 www-data)对目标目录有 r-x 权限
- 涉及符号链接,加上 disable_symlinks on; 防路径逃逸


















