推荐使用 alias 精确映射多级子目录,因其可完全替换匹配的 URL 路径部分;root 则将完整 URI 拼接到基础路径后,易致 404。需注意 location 与 alias 末尾斜杠一致性,并避免混用二者。

要在 Nginx 的 root 路径下实现多级子目录的静态文件访问,核心是正确配置 location 块与 root(或 alias)指令的配合,避免路径拼接错误。默认情况下,Nginx 的 root 指令会将请求 URI 完整拼接到根路径后,这在多级子目录访问时容易导致 404。
理解 root 与 alias 的关键区别
root 是“基础路径前缀”,Nginx 会把整个请求 URI(包括路径部分)追加到它后面;alias 是“路径替换”,会用指定值**完全替换**匹配的 location 路径部分。
- 例如:请求
/static/css/app.css,root /var/www→ 实际查找/var/www/static/css/app.css - 而
location /static/ { alias /var/www/assets/; }→ 实际查找/var/www/assets/css/app.css(/static/被替换成/var/www/assets/)
推荐方案:用 alias 精确映射子目录
当需要将 URL 中某个多级路径(如 /a/b/c/)映射到磁盘上对应或非对应的深层目录时,alias 更直观可控。
- 确保
location以/结尾,且alias值也以/结尾,避免路径拼接歧义 - 示例:让
/api-docs/v2/访问/usr/share/nginx/html/docs/v2/
location /api-docs/v2/ {
alias /usr/share/nginx/html/docs/v2/;
index index.html;
try_files $uri $uri/ =404;
}
若坚持用 root:需匹配最外层路径并依赖目录结构对齐
适用于子目录层级与 URL 路径严格一致的场景(如站点根目录即为静态资源根)。
- 设置
root /var/www/html;后,/project/a/b/file.js就必须真实存在于/var/www/html/project/a/b/file.js - 可配合
try_files支持 SPA 的 history 模式回退,但不改变 root 的拼接逻辑
server {
listen 80;
root /var/www/html;
index index.html;
<pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
调试技巧与常见陷阱
- 开启
error_log /var/log/nginx/error.log debug;查看实际查找的文件路径 - 注意 trailing slash:`location /sub/` 和 `location /sub` 行为完全不同(前者匹配所有以 `/sub/` 开头的请求,后者只精确匹配 `/sub`)
- 避免在
location中混用root和alias(同一 location 内只能用其一) - Windows 路径分隔符无需转义,但 Linux 下路径末尾斜杠影响语义,务必统一











