nginx中alias与try_files联用需用$request_filename替代$uri,且location和alias路径均须以/结尾;spa场景推荐分设/assets/和/两个location,分别处理静态资源与路由回退。

在 Nginx 中,try_files 和 alias 一起用时容易出错,根本原因在于二者路径解析逻辑不一致:alias 是做 URI 前缀替换,而 try_files 默认基于 root(或当前上下文)查找文件,它并不自动感知 alias 映射后的实际路径。
为什么直接写 try_files $uri =404 会失败
假设配置如下:
location /static/ {alias /var/www/assets/;
try_files $uri =404;
}
当请求 /static/js/app.js 时:
-
$uri的值是原始路径/static/js/app.js -
try_files会尝试在root目录下找这个完整路径,比如/var/www/html/static/js/app.js - 但真实文件其实在
/var/www/assets/js/app.js,所以始终 404
正确做法:用 $request_filename 替代 $uri
$request_filename 是 Nginx 内部已根据 alias(或 root)计算出的绝对磁盘路径,能准确反映文件该去哪找。
上面例子应改为:
alias /var/www/assets/;
try_files $request_filename =404;
}
这样请求 /static/js/app.js 时,$request_filename 就是 /var/www/assets/js/app.js,检查存在性才真正有效。
alias 路径和 location 必须都以 / 结尾
这是常见翻车点。错误写法:
location /static/ { alias /var/www/assets; }→ 请求 /static/logo.png → 实际拼成 /var/www/assetslogo.png(缺斜杠)
正确写法:
-
location /static/ {—— location 末尾带/ -
alias /var/www/assets/;—— alias 路径也必须以/结尾
SPA 场景下的典型组合配置
前端单页应用常需静态资源走别名,其余路由 fallback 到 index.html。推荐分两个独立 location 处理,互不干扰:
alias /opt/app/dist/assets/;
try_files $request_filename =404;
}
location / {
root /opt/app/dist;
try_files $uri $uri/ /index.html;
}
说明:
-
/assets/下所有请求由alias映射,并用$request_filename精确校验文件 - 其他路径(如
/user/profile)先查真实文件/目录,不存在就返回/index.html,交由前端路由处理











