try_files 是 Nginx 内部路径判别与兜底的核心机制,按参数从左到右检查文件/目录存在性,$uri 表示原始路径,$uri/ 视为目录,最后一个参数必须是状态码、命名 location 或带查询参数的 URI。

try_files 是 Nginx 处理静态资源请求最轻量、最高效的核心机制,不依赖 rewrite,也不触发外部跳转,全程在服务端内部完成路径判别与兜底。它本质是一套“存在即返回,全无则转向”的短路逻辑,关键在于顺序、路径解析规则和最后一个参数的语义约束。
理解 try_files 的执行顺序和路径含义
指令按空格分隔的参数从左到右依次检查:每个参数被当作相对于 root(或 alias)定义的路径来查找文件或目录。只要某一项存在(文件可读,或目录可进入),Nginx 立即用它响应请求,后续参数不再检查。
- $uri 表示原始请求路径,例如 /api/user → 查找 /var/www/html/api/user
- $uri/ 表示尝试将该路径视为目录,例如 /blog/ → 查找 /var/www/html/blog/(需配合 index 指令才能返回 index.html)
- 最后一个参数不能是普通文件路径,必须是:=404、=403 等状态码,或以 @ 开头的命名 location,或带查询参数的 URI(如 /index.php?$args)
- Nginx 不自动补扩展名,$uri 不会尝试匹配 $uri.html 或 $uri/index.html
SPA 应用的标准化配置(最常用场景)
单页应用(如 Vue、React)使用 History 路由时,/user、/admin 等路径在服务端没有对应物理文件,直接 404。用 try_files 可让所有非静态资源请求回退到 index.html,由前端 JS 解析路由。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 基础写法:
try_files $uri $uri/ /index.html; - 更严谨写法(保留查询参数):
try_files $uri $uri/ /index.html?$args; - 注意 root 必须指向 dist 构建输出目录,且 /index.html 文件真实存在;否则会因兜底路径不存在而报 500 错误
静态资源优先 + 后端代理兜底
适用于前后端分离部署:前端资源走 Nginx 直出,API 请求转发给后端服务。
- 配置示例:
try_files $uri $uri/ @proxy; - 对应命名 location:
location @proxy { proxy_pass http://127.0.0.1:8000; } - 此方式比 rewrite 更快,避免正则匹配开销;且 @proxy 中可统一设置 proxy_set_header、timeout 等
- 若需保留原始请求参数,应在 proxy_pass 前显式透传:proxy_set_header X-Original-URI $request_uri;
多级缓存路径与条件回退
适合 CDN 回源或本地多层缓存架构,比如先查内存缓存路径,再查磁盘缓存,最后查源站。
- 示例:
try_files /cache/$uri /static/$uri @origin; - 其中 /cache/ 和 /static/ 都是相对于 root 的子路径;@origin 可指向 upstream 或 fastcgi_pass
- 若想对图片等资源单独设 404,可写:
location ~* \.(png|jpg|gif)$ { try_files $uri =404; } - 注意:=404 必须写成 =404(等号与数字间无空格),否则语法错误
不复杂但容易忽略。核心就三点:顺序决定优先级,路径基于 root/alias 解析,最后一个参数必须合法且承担兜底职责。

















