Nginx 中 location 不直接处理404,需通过 error_page 指令拦截并重定向至 internal 的 JSON 响应 location,配合 return 404 与 add_header 设置 Content-Type 实现标准 JSON 404 返回。

在 Nginx 中,location 块本身不直接“处理”404 错误,而是通过匹配请求路径决定是否由该块响应;真正的 404 处理依赖于 error_page 指令与自定义错误页面(或响应体)配合实现。要让匹配到的 location 返回 JSON 格式的 404,关键在于:拦截 404 状态、屏蔽默认 HTML 页面、输出合法 JSON 并设置正确 Content-Type。
用 error_page 拦截并重定向到内部 location
这是最常用且推荐的方式:在 server 或 location 块中定义 error_page 404 = /_404_json,再用一个内部 location(以 _ 开头避免外部访问)生成 JSON 响应。
-
必须加
=符号,表示返回原始状态码(404),否则 Nginx 默认转为 200 - 内部 location 需用
internal声明,防止被客户端直接请求 - 用
return直接输出 JSON 字符串,并显式设置Content-Type: application/json
完整配置示例
以下配置会让所有未匹配的请求(或指定 location 下的缺失资源)返回标准 JSON 404:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 全局 404 JSON 处理
error_page 404 = /_404_json;
location /api/ {
# 示例:/api/ 下的子路径也走统一 JSON 404
error_page 404 = /_404_json;
# 其他 proxy_pass 或 try_files 配置...
}
location = /_404_json {
internal;
add_header Content-Type "application/json; charset=utf-8";
return 404 '{"code":404,"message":"Not Found","path":"$request_uri"}';
}}
注意:$request_uri 是 Nginx 内置变量,会自动插入当前请求路径,无需额外 set。
避免常见陷阱
实际部署中容易出错的地方:
-
不要在 location 中直接写
return 404后跟 JSON —— 这只会返回纯文本,Content-Type 默认是 text/plain -
不要省略
add_header或default_type—— 浏览器或客户端可能无法正确解析 JSON -
不要用
root或alias指向文件 —— 静态 JSON 文件仍需确保 MIME 类型正确,不如return简洁可控 -
如果用了 try_files,确保 fallback 路径最终触发 error_page,例如
try_files $uri @fallback;+location @fallback { return 404; },再靠外层 error_page 捕获
可选:为不同 location 定制 JSON 结构
若需区分 API 和静态资源的错误格式,可在对应 location 内单独定义 error_page,指向不同的内部 location:
location /static/ {
alias /var/www/static/;
error_page 404 = /_404_static;
}
<p>location = /_404_static {
internal;
add_header Content-Type "application/json";
return 404 '{"error":"static resource not found"}';
}这样就能按上下文返回语义更明确的 JSON 错误信息,同时保持 HTTP 状态码规范。


















