NGINX中try_files用法
在 Nginx 中,try_files 是一个极为实用的指令,主要用于 按顺序检查文件或路径是否存在,并返回第一个匹配到的资源或执行备用操作。它常见于 server 或 location 块中,尤其在单页应用(SPA)、静态资源服务和 URL 重写等场景下发挥关键作用,语法如下:
location / {
try_files file1 file2 ... fallback;
}
file1,file2:按顺序检查的文件或路径(相对于root或alias指定的目录)fallback:当所有文件都不存在时的备用处理方式(可以是内部重定向,比如:/index.html、命名 location,比如: @backend 或状态码,比如: 404/403等)
1、检查静态资源是否存在,不存在返回abc目录下默认文件index.html,查看nginx配置文件,如图:

上述配置理解为:如果默认情况下什么路由都不加,那么请求到abc/index.html,如果请求的时候加了一个路由,比如 “ip/about.txt”,那么首先会查找abc路径下是否有about.txt文件,此时about.txt对应的就是$uri,如果没有找到about.txt,那么继续查找abc路径下是否有about.txt目录,这个about.txt目录对应的就是”$uri/” ,如果有,那么就请求about.txt目录的内容,如果也没有这个目录,那么就返回默认的页面,也就是最开始的abc/index.html
注:找about.txt目录下的文件默认也是index.html
举例:
(1)、如果什么路径都不加,直接使用IP访问,默认会找到abc下的index.html,如图:

(2)、在abc目录下定义about.txt目录,在此目录下定义index.html文件,写入内容,通过ip/about.txt访问,如图:

因为abc目录下没有about.txt文件,但是有about.txt目录,因此跳过$uri,继续找$uri/,找到了并返回结果
(3)、在abc目录下定义test.txt文件,写入内容,此时通过ip/test.txt访问,如图:

此时符合了第一个$uri,因此不会继续向后面查找了
(4)、直接通过ip请求未知的资源路径,ip/gong.doc,回到了默认页面,如图:

因为abc路径下不存在gong.doc也不存在这个目录,因此就会找到最终的/index.html
2、检查静态文件是否存在,不存在则转发到后端应用,源nginx的配置,如图:

上图中的配置可以理解为如果请求的路由不匹配$uri和$uri/,那么会转发到@backend的后端服务,这个backend名称是自定义的,因此如果请求http://192.168.49.83/test_route的时候,但是本地没有对应的匹配,因此会转发到http://192.168.49.224/test_route,这个test_route会带到后端去的
这里还是以两个nginx的静态页面举例:
(1)、修改49.224的nginx配置文件,添加内容如图:

注:在后端的nginx配置中,也要有这个test_route路由,否则会报404错误
(2)、在/data/html目录下新建test_route目录并定义index.html文件,如图:

(3)、此时通过源IP来请求test_route路由,因为当前没有匹配,就回跳转到后端服务去,如图:

上述NGINX配置中有个参数,如下:
add_header X-Tried-File $uri always; #always表示对所有响应有效
此参数的意思是在 HTTP 响应头 中新增一个自定义头字段 X-Tried-File,其值为 用户实际请求的文件路径(即 $uri 变量),查看响应头信息,可以看到X-Tried-File,如图:

3、检查静态文件是否存在,不存在直接返回404,如图:

请求gong.txt,既不存在此文件也不存在此目录,因此直接返回404,如图:

4、访问页面,直接返回状态码,适合维护页面,如图:

在abc目录下定义maintenace.html(名字要与nginx配置名字一致),然后通过192.168.49.83请求,如图:

5、嵌套条件,修改nginx配置文件,如图:

上面配置理解为:如果请求/hello,那么匹配/custom/hello,如果匹配不到就继续匹配/default/hello,如果都匹配不到就返回404
举例:
在abc目录下新建custom目录并在内部创建gong.txt文件,新建default目录并在内部新建guan.txt,通过url请求,如图:




