try_files 是 Nginx 按优先级检查静态文件并内部重定向的核心指令,必须在 location 中使用,语法为 try_files file1 file2 ... uri;支持变量、多级 fallback、SPA 路由兜底和灰度发布分流。

当用户请求一个静态资源时,Nginx 可以按优先级依次检查多个路径是否存在该文件,任一命中即返回,全部失败再交由后端或返回 404 —— 这正是 try_files 的核心能力。它不依赖 rewrite 规则,轻量高效,是构建健壮静态服务、灰度发布、fallback 页面、多版本资源路由的底层利器。
理解 try_files 的执行逻辑与语法结构
try_files 指令必须放在 location 块中,其基本形式为:
含义是:依次检查 file1、file2 是否存在且可读(路径基于 root 或 alias);若都不存在,则内部重定向到最后的 uri(必须以 / 开头),由对应 location 处理。注意:最后的 uri 不是外部跳转,而是内部重写,URL 地址栏不变。
常见误用点:
- 末尾 uri 写成相对路径(如
index.html)会报错,必须是绝对路径(如/index.html) - 中间 file 项支持变量(如
$uri.gz),但需确保变量有值且不为空,否则跳过该项 - 不能在 if 块中使用 try_files,Nginx 会直接拒绝加载配置
实战一:静态资源多级 fallback(.gz → .br → 原文件)
为提升传输效率,常对静态文件预压缩。利用 try_files 可自动按优先级提供最优编码格式:
root /var/www;
try_files $uri.gz $uri.br $uri =404;
}
说明:
- 请求
/static/app.js时,Nginx 先查/var/www/static/app.js.gz,存在则返回并自动设置Content-Encoding: gzip - 若 .gz 不存在,再查
.br,仍不存在则返回原始app.js -
=404是特殊写法,表示全部失败时直接返回 404,不触发任何 location 匹配
实战二:单页应用(SPA)的前端路由兜底
Vue/React 应用启用 history 模式后,刷新子页面(如 /user/profile)会触发 Nginx 查找物理路径。用 try_files 将所有未命中资源统一指向 index.html,交由前端路由接管:
root /var/www/spa;
try_files $uri $uri/ /index.html;
}
关键细节:
-
$uri/表示尝试作为目录访问(触发 index 指令或 403/404),避免把/api/这类真实接口也兜底到 index.html - 若后端 API 与前端同域,建议将 API 请求显式分离到
/api/location,并 proxy_pass 到后端,防止被兜底 - 务必确认
index.html文件真实存在于 root 目录下,否则会陷入循环重定向
实战三:灰度发布中的资源路径分流
上线新版本前,可将部分用户流量导向带版本前缀的静态资源目录,同时保留老路径兼容性:
location /assets/ {alias /var/www/v2/assets/;
try_files $uri @fallback;
}
location @fallback {
alias /var/www/v1/assets/;
try_files $uri =404;
}
说明:
- 先在 v2 目录查找资源,命中即返回;未命中则跳转到命名 location
@fallback -
@fallback中的alias和try_files独立作用,形成二级检索链 - 配合 cookie 或 header 判断,还可动态选择进入哪个 location,实现更精细的灰度策略


















