try_files未命中时内部重定向至最后一个参数:可为备用文件路径(如/fallback.html)、命名location(如@backend)或状态码(如=404);配合error_page可捕获后端错误实现降级。

当 Nginx 的 try_files 按顺序检查所有指定路径都未命中时,它会把请求“内部重定向”到最后一个参数所指向的目标——这个目标可以是备用文件路径、命名 location,或直接返回状态码。
跳转到备用静态文件
最简单的方式是把备用文件路径作为最后一个参数。Nginx 会尝试用当前 root 或 alias 构造出完整路径,然后查找并返回该文件:
-
try_files $uri $uri/ /fallback.html;→ 若/path和/path/都不存在,就返回/var/www/html/fallback.html(假设root /var/www/html) - 注意:备用路径必须是相对于
root或alias的,不能写绝对路径(如/opt/app/404.html),否则会找不到
跳转到命名 location 做代理或复杂处理
当备用逻辑不止是返回一个文件(比如要转发给后端、重写 URL、或做权限判断),就把最后一个参数设为 @name 形式的命名 location:
try_files $uri $uri/ @backend;- 然后定义:
location @backend { proxy_pass http://my_upstream; } - 这样所有未命中静态资源的请求,都会交由该 location 处理,不经过外部重定向,性能更好
直接返回固定状态码
如果不想提供任何备用内容,而是明确告诉客户端“没找到”,可用 =404、=503 等语法:
-
try_files $uri $uri/ =404;→ 所有未匹配路径都返回标准 404 响应 -
try_files $uri $uri/ =503;→ 可用于维护期统一返回服务不可用 - 注意:
=后只能跟数字状态码,不能加路径或变量
结合 error_page 实现更灵活的兜底
单纯靠 try_files 无法捕获后端失败(如 proxy_pass 超时或返回 502)。这时需配合 error_page:
- 在命名 location 中启用
proxy_intercept_errors on; - 再用
error_page 502 503 504 = @fallback;拦截错误,并跳转到另一个命名 location - 这样就形成「静态→主后端→失败后降级到备用后端/页面」的完整链路











