location块通过error_page承接api错误码,需配合proxy_intercept_errors等指令捕获状态码,用命名location(如@badreq)配合return返回json响应并显式设置content-type,或用精确匹配location返回静态html错误页。

Location 块本身不直接“配置错误页面”,而是作为 error_page 的承接端,用于精准拦截并响应特定 API 错误码。关键在于把状态码触发、路径映射、内容生成三者串起来,尤其在 API 场景下需返回 JSON 而非 HTML。
明确 error_page 触发条件与作用域
API 错误码(如 400、429、502)必须先被 Nginx 捕获,才能交由 location 处理:
- 反向代理场景:需开启 proxy_intercept_errors on;,否则后端返回的 400/502 等会被透传,不触发 error_page
- FastCGI(如 PHP)场景:对应启用 fastcgi_intercept_errors on;
- 限流触发 429:需配合 limit_req_status 429; 显式声明状态码,否则默认是 503
- error_page 必须放在能覆盖到请求的作用域——通常放在 location 块内(针对某组 API),或 server 块(全局 API 接口)
用命名 location 实现 JSON 错误响应
命名 location(如 @badreq)是唯一支持 return 指令带响应体且不依赖文件的位置,适合返回结构化错误:
- 写法示例:error_page 400 = @api_error;(等号表示替换原始状态码)
- 对应定义:location @api_error { return 400 '{"code":400,"msg":"Invalid request"}'; add_header Content-Type "application/json"; }
- 注意:return 后的状态码必须与 error_page 目标一致,否则会冲突;add_header 必须显式设置,否则默认是 text/plain
精确匹配静态错误页(仅限 HTML 或纯文本)
若需返回定制 HTML 错误页(如维护页),要用 location = /path 精确匹配,并加 internal 防直访:
- 配置:error_page 503 /maintenance.html;
- 承接:location = /maintenance.html { root /usr/share/nginx/html; internal; }
- root 路径要指向真实文件所在目录;internal 是强制项,避免用户通过 GET /maintenance.html 绕过业务逻辑
区分状态码透传与覆盖
是否保留原始错误码,取决于 error_page 行末是否带等号及后续处理方式:
- error_page 502 /error.html; → 返回 /error.html 内容,但状态码仍是 502(需 proxy_intercept_errors on 才生效)
- error_page 502 = /error.html; → 返回 /error.html 内容,状态码覆盖为 200(除非内部 location 用 return 显式设回 502)
- 想返回 502 + 自定义 JSON?写成:error_page 502 = @backend_fail;,再在 @backend_fail 中用 return 502 {...}
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











