try_files 是 Nginx 按序检查文件/路径存在性的指令,匹配成功则返回资源;失败时可通过命名 location 配合 return 返回自定义状态码及纯文本,如 410 或 404。

try_files 是 Nginx 中用于按顺序检查文件或路径是否存在,并在匹配成功时直接返回该资源的核心指令。它本身不直接“返回文本状态码”,但可通过搭配 error_page、命名 location 或内部重定向,间接实现「检查失败时返回自定义状态码(如 404、410)或纯文本响应」的效果。
基本语法与执行逻辑
语法格式为:
try_files file1 file2 ... uri;含义是:Nginx 依次检查 file1、file2 是否存在(作为真实文件或目录);若都不存在,则内部重定向到 uri(可为命名 location 或普通路径)。注意:uri 不会触发外部跳转,而是继续在 server 或 location 内部处理。
用 try_files 实现“文件不存在时返回 410 Gone 文本”
常见需求:某个旧 API 路径已彻底废弃,希望访问时直接返回 410 Gone 及纯文本说明,而不是默认 404。可结合 try_files + named location 实现:
try_files $uri @gone;
}
location @gone {
return 410 "This API is permanently removed.\n";
}
说明:
-
$uri表示原始请求路径(如/api/old/user),Nginx 检查对应物理文件是否存在; - 若不存在,跳转到
@gone这个命名 location; -
return 410 ...直接终止处理,返回状态码和文本(自动设置Content-Type: text/plain)。
检查多个静态路径并兜底返回 404 文本
例如想优先服务 .html、再试 .htm、最后返回简洁的 404 提示:
try_files $uri.html $uri.htm $uri @notfound;
}
location @notfound {
return 404 "Page not found.\n";
}
关键点:
-
$uri.html是变量拼接,Nginx 会检查/path/index.html这类文件; - 所有
try_files后缀检查失败后才进@notfound; -
return的文本会原样输出,无需额外配置 MIME 类型。
避免常见陷阱
使用时需注意:
-
try_files最后一个参数必须是 URI(以/开头)或命名 location(以@开头),不能是状态码或纯文本; - 不要写成
try_files $uri =404来“直接返回 404”——这虽能工作,但无法返回自定义文本,且绕过了 error_page 机制; - 若依赖
error_page 404兜底,需确保try_files的最终 fallback 是一个会触发 404 的路径(如/nonexistent),再用error_page 404 @my404捕获; -
return指令在命名 location 中最灵活,推荐优先使用。


















