Nginx 中 location 块不直接配置错误状态码,而是通过 error_page 指令配合内部 location 实现拦截与响应控制:精确匹配 location = /path 处理自定义错误页;error_page 后加等号可替换状态码,不加则透传;return 指令可直接返回指定状态码;limit_req_status 可修改限流状态码并结合命名 location 定制响应。

Nginx 中 location 块本身不直接“配置”错误状态码,而是配合 error_page 指令和内部 location 实现对特定错误状态码的拦截与响应控制。关键在于:状态码由上游(后端、Nginx 自身逻辑)生成,location 的作用是承接并处理它。
以下是实际生效的核心配置逻辑:
location 用于定义错误响应的资源路径
当 error_page 404 /404.html; 被触发时,Nginx 会尝试匹配 location = /404.html 这个精确匹配块,从中读取文件。必须确保:
-
location = /404.html存在且写法为精确匹配(带等号) - 该 location 内指定
root或alias,指向真实可读的 HTML 文件 - 推荐加
internal;,防止用户直接访问/404.html
例如:
location = /404.html {
root /usr/share/nginx/html;
internal;
}
location 配合 error_page 实现状态码替换或透传
在反向代理场景中,若后端返回 502,Nginx 默认透传该状态码——除非你主动干预:
-
error_page 502 = /error.html;→ 返回/error.html的内容,并把响应状态码覆盖为 200(因为等号表示“替换”,且未显式 return 状态码) -
error_page 502 /error.html;→ 返回/error.html的内容,但仍保持 502 状态码(前提是proxy_intercept_errors on;已启用)
所以真正影响最终状态码的,是 error_page 行是否带等号,以及内部 location 是否用 return 显式声明。
location 中用 return 直接返回自定义状态码
你可以在任意 location 块里用 return 指令直接发回指定状态码(含可选响应体),无需外部文件:
location /maintenance {
return 503 "Service temporarily unavailable";
}
这种写法适用于简单提示、维护页跳转或 API 错误响应。
location 结合 limit_req_status 控制限流状态码
限流触发时,默认返回 503。如需改为 429,需在同级 location 中同时配置:
limit_req zone=api burst=5;
limit_req_status 429;
error_page 429 = @rate_limited;
location @rate_limited {
default_type application/json;
return 429 '{"error":"Too many requests"}';
}
这里 location @rate_limited 是命名 location,专用于承接 error_page 转发,return 429 确保状态码准确发出。
不复杂但容易忽略











