nginx try_files指令解读

try_files 是 Nginx 里一个非常实用的指令,用来按顺序检查文件是否存在,并把请求重定向到第一个存在的目标。它常被用来做静态资源优先、SPA 路由兜底、伪静态等。


典型例子

1
2
3
4
location / {
root /data/www;
try_files $uri $uri/ /index.html;
}

执行流程是:

  1. 先找 /data/www$uri 是否存在
  2. 再找 /data/www$uri/(目录)是否存在
  3. 都不存在时,把请求交给 /index.html

流程图

flowchart TD
A[客户端请求 URI] --> B{文件 $uri 存在?}
B -- 是 --> C[直接返回文件]
B -- 否 --> D{目录 $uri/ 存在?}
D -- 是 --> E[返回目录索引或 index 文件]
D -- 否 --> F[转发到 /index.html]

使用场景

1.SPA 前端(Vue/React)路由兜底

浏览器访问:

/user/profile

但服务器上只有:

index.html

用:

1
try_files $uri $uri/ /index.html;

让前端路由接管。


2.静态优先,动态兜底(PHP 示例)

1
2
3
location / {
try_files $uri $uri/ /index.php?$query_string;
}

3.防止 404 直接落到后端

反向代理时:

1
2
3
4
5
6
7
8
location / {
# 减缓无效请求
try_files $uri @backend;
}

location @backend {
proxy_pass http://app;
}

只有文件不存在时才打到后端。


4.root 与 alias 的区别

错误配置常见:

1
2
3
4
location /static/ {
alias /data/static/; # 必须是root
try_files $uri =404;
}

alias 下 $uri 拼接方式不同,路径容易错位。


5.最后一个参数可以是状态码

1
try_files $uri $uri/ =404;

找不到直接返回 404。


性能角度思考

在高并发场景中:

  • try_files 只做文件存在检查(stat syscall)
  • 开销远小于进入后端服务
  • 适合做第一层流量过滤

高并发 Nginx 的常见策略是:

静态命中 → Nginx 返回
未命中 → 后端处理

减少应用服务器负载。


Nginx看作流量入口,try_files 就像第一道逻辑分流阀门——尽量在最靠近用户的位置解决请求,把昂贵计算留给真正需要它的部分。这种越早处理越省资源的思路,同样适用于缓存、CDN、WAF、甚至服务网格的整体架构演进。