nginx 中 try_files 可通过 =code 直接返回 410、451 等状态码,或配合 error_page 实现自定义响应;前者无响应体,后者可返回 html 页面。

在 Nginx 中,try_files 本身不直接返回自定义状态码(如 410、451),但它能配合 error_page 和特殊语法(如 =code)实现精准控制。关键在于区分两种场景:显式终止返回 vs 内部跳转后由 error_page 接管。
用 =code 直接返回指定状态码
当 try_files 所有检查项都失败时,最后一个参数若写作 =410 这类形式,Nginx 就会立即返回该状态码,不走任何 location 匹配或 error_page 流程:
-
try_files $uri $uri/ =410;:请求路径不存在文件也不存在目录,直接返回 410 Gone -
try_files $uri @fallback =404;:前两项失败后尝试命名 location @fallback;若 @fallback 也未处理(比如里面没内容或没 return),则最终返回 404 - 注意:
=code后不能跟响应体,浏览器收到的是纯状态码+默认响应头,无 HTML 页面
用 error_page 把内部跳转转为自定义状态码
更常用且灵活的方式是让 try_files 跳转到一个“假路径”,再用 error_page 拦截并重写状态码,同时可返回真实页面:
- 先触发跳转:
try_files $uri $uri/ /_notfound_;(/_notfound_是个故意不存在的 URI) - 再接管并改码:
error_page 404 =410 /dev/null;—— 把所有 404 都转成 410,并丢弃响应体 - 或者返回带内容的自定义页:
error_page 404 =451 /451.html;,需确保location = /451.html { internal; }和对应 root 设置正确
针对特定路径统一返回某状态码(如废弃接口)
适合做灰度下线、法律合规(如 GDPR 删除请求)等场景:
- 在对应 location 块中强制触发 404,再转义:
location /old-api/ { try_files /nonexistent @gone; } - 全局定义:
error_page 404 =410 /dev/null; - 效果:所有以
/old-api/开头的请求,无论路径是否真实存在,都返回 410 Gone 状态码
注意事项与常见坑
配置生效依赖几个关键细节,漏掉任一环节都会导致返回默认 404 或 500:
-
try_files最后一项必须是 URI(以/开头)或=code,不能是相对路径或纯文件名 -
error_page的作用域很重要:写在server块里对全部 location 生效;写在某个location里只影响该路径 - 若用
error_page 404 /xxx.html返回页面,记得加location = /xxx.html { internal; }防止用户直接访问 -
=code方式无法返回自定义 HTML;要带页面就得走error_page + URI组合











