Nginx可通过server块中error_page指令统一拦截错误码并返回自定义页面或响应,需配合internal location匹配路径,支持多状态码映射、JSON返回及proxy_intercept_errors透传处理。

在 Nginx 中,可以通过 error_page 指令配合 location 块,在 server 级别统一拦截错误码并返回自定义提示页面或响应内容,无需为每个 upstream 或 location 单独配置。
统一拦截常见错误码(如 404、500、502 等)
在 server 块中使用 error_page 将指定状态码重定向到内部 location。注意:该指令作用于当前 server 块,且会继承至其下所有 location(除非被子块显式覆盖)。
- 用
error_page 404 /404.html;拦截 404,Nginx 会内部重定向到/404.html路径(不触发外部跳转) - 支持多个状态码映射同一路径:
error_page 500 502 503 504 /5xx.html; - 若需返回纯文本或 JSON 提示,可搭配
return指令(Nginx ≥ 1.13.7):error_page 403 =403 '{"error":"Access denied"}';
自定义响应内容需配合 location 块处理
error_page 后的路径必须由一个 location 块匹配并响应,否则会报 500 错误。推荐用前缀匹配 + internal 限定,防止用户直接访问错误页:
location = /404.html { internal; root /usr/share/nginx/html; }location = /5xx.html { internal; root /usr/share/nginx/html; }-
internal表示仅允许内部重定向访问,禁止浏览器直接请求该 URL -
root指定静态文件根目录;也可用alias(注意末尾斜杠和路径拼接差异)
透传原始错误信息(可选进阶)
若后端应用返回了带 body 的错误响应(如 JSON API),又想保留原始响应体但统一格式,可用 proxy_intercept_errors on; 配合 error_page:
- 在
location或server块中启用:proxy_intercept_errors on; - 再配置
error_page 400 401 403 404 500 502 503 504 = @error_handler; - 定义命名 location:
location @error_handler { ... },在里面用return或proxy_pass返回标准化响应 - 注意:开启后,Nginx 会丢弃后端返回的 body,只根据状态码触发 error_page —— 如需保留 body,需用 Lua 模块或 OpenResty
验证与调试要点
配置生效前务必检查语法并重载,同时留意几个易错细节:
- 运行
nginx -t确保配置无语法错误 - 确认自定义页面文件存在且 Nginx 进程有读取权限(如 SELinux 或文件权限限制)
- 浏览器可能缓存旧错误页,测试时加参数(如
?t=1)或禁用缓存 - 查看
error_log日志,若出现open() "/path/404.html" failed (2: No such file or directory),说明文件路径不对


















