Nginx 的 try_files 不支持直接返回状态码,需通过命名 location(如 @notfound)配合 return 指令实现;例如 try_files $uri $uri/ @notfound;location @notfound { return 404 "Page not found"; }。

在 Nginx 中,try_files 本身**不支持直接指定 HTTP 状态码**(比如 404、403、500),它只负责按顺序检查文件或路径是否存在,并在全部失败时**内部重定向**到一个 URI(通常是 @named_location 或普通 location)。
要实现“当 try_files 所有选项都未命中时返回自定义错误状态码”,核心思路是:把最后的 fallback 目标设为一个内部 location,在其中用 return 指令明确返回所需状态码。
✅ 正确做法:用 named location + return
这是最常用、最清晰的方式:
- 在
try_files的最后一个参数中,使用@fallback这样的命名 location - 单独定义
location @fallback { return 418; }(418 是示例,可换任意标准或自定义状态码) - 注意:该 location 必须是 internal(Nginx 默认命名 location 就是 internal,无需显式声明)
示例配置:
location / {
try_files $uri $uri/ @notfound;
}
<p>location @notfound {
return 404 "Page not found — custom message";</p><h1>或返回 JSON:</h1><pre class="brush:php;toolbar:false;"># add_header Content-Type "application/json";
# return 404 '{"error":"not_found"}';}
⚠️ 注意事项
-
return后的状态码必须是 Nginx 支持的整数(如 403、410、451、503 等),不能是字符串 - 若需返回非标准码(如 499、444),确保它被 Nginx 认可(444 是合法的“关闭连接无响应”;499 是客户端关闭,但 Nginx 不主动发 499,仅记录)
- 不要在
try_files最后写成return 404—— 语法错误,Nginx 会拒绝加载配置 - 避免用
error_page 404 /404.html配合 try_files fallback,否则可能触发双重处理或循环
? 进阶:根据条件返回不同状态码
如果需要更灵活控制(例如:文件不存在返回 404,但目录无索引且禁止列目录时返回 403),可结合 if + return,但注意 if 在 location 中有局限性。推荐方式仍是用命名 location 分流:
location / {
try_files $uri @check_dir;
}
<p>location @check_dir {
if (-d $request_filename) {
return 403 "Directory access denied";
}
return 404;
}</p>
(注:if 在此场景下是安全的,因只用于文件系统检测)
❌ 常见误区
- 写成
try_files $uri =404—— 这是旧语法(Nginx ≤ 0.7.x),已废弃,现代版本会报错 - 试图在
try_files里直接调用error_page—— 语法不支持 - 用
rewrite ... break跳转再 return —— 多余且易出错,不如直接命名 location
不复杂但容易忽略:try_files 是“找资源”,不是“发响应”;真正发状态码,得交给 return 或 error_page。











