nginx 中 alias 与 try_files 混用易致 404,因 alias 不改变 $uri 而 try_files 默认用 $uri 查找文件;正确方式为:①优先用 root 替代 alias,②非用 alias 时必须用 $request_filename。

Nginx 中 alias 和 try_files 直接混用容易出 404,不是配置写错了,而是两者路径处理机制天然不兼容。
alias 是做 URI 前缀截断 + 路径拼接,但它不改变 $uri 的值;而 try_files 默认用 $uri(原始请求路径)去 root 下找文件,完全不知道 alias 已经把实际路径换掉了。结果就是:文件明明在 /var/www/assets/js/app.js,Nginx 却去 /var/www/html/static/js/app.js 查——自然 404。
✅ 正确配合方式只有两种,选其一
优先用 root 替代 alias(推荐)
语义清晰、行为可预测,尤其适合静态资源前缀映射:
location /static/ {
root /var/www;
try_files $uri $uri/ =404;
}
请求 /static/js/app.js → 拼成 /var/www/static/js/app.js,直接检查是否存在,无需额外绕弯。
非用 alias 不可时,必须用 $request_filename
它是 Nginx 内部已根据 alias 计算出的真实绝对路径,try_files 才能真正校验目标文件:
location /assets/ {
alias /opt/app/dist/assets/;
try_files $request_filename $request_filename/ =404;
}
$request_filename 此时已是 /opt/app/dist/assets/js/app.js,检查它是否存在才有效。
⚠️ 常见错误写法(务必避免)
-
try_files $uri =404;——$uri还是/assets/js/app.js,Nginx 仍按root拼,错位 -
try_files /$uri =404;—— 手动加/反而变成/assets/js/app.js,路径更乱 - 在正则 location 里混用
alias和try_files且未显式引用捕获变量 —— 容易触发 internal redirection cycle
? 实际场景示例:SPA + 静态资源分离
location /assets/ {
alias /opt/app/dist/assets/;
try_files $request_filename =404;
}
location / {
root /opt/app/dist;
try_files $uri $uri/ /index.html;
}
-
/assets/xxx.png走alias映射并精确检查文件 - 其他路径(如
/user/profile)先查真实文件,不存在就回退到index.html,由前端路由接管 - 两个 location 各自独立,不干扰彼此路径逻辑
不复杂但容易忽略。











