nginx 配置错误页面需用 error_page 指令映射状态码到内部路径,并满足三条件:启用 intercept_errors、定义带 internal 的 location 块、确保文件存在且 ≥512 字节。

在 Linux 的 Nginx 中配置不同状态码的错误页面,核心是用 error_page 指令把状态码映射到可访问的内部路径,并确保 Nginx 能真正“接管”这些错误响应。光写一行 error_page 404 /404.html 很可能无效,必须同时满足几个硬性条件。
基本配置:绑定状态码与静态页面
最常用方式是在 server 块中声明:
-
error_page 404 /404.html;—— 所有 404 请求返回根目录下的404.html -
error_page 500 502 503 504 /50x.html;—— 多个后端错误共用一个兜底页 -
error_page 403 =403 /forbidden.html;—— 显式保留原始 403 状态码(对前端识别很重要)
关键配套:让 error_page 真正生效
以下三点缺一不可,否则你看到的仍是默认白页或浏览器兜底页:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
开启拦截开关:Nginx 默认不拦截后端返回的错误码
→ 反向代理(如 Node.js、Tomcat):在对应location块加proxy_intercept_errors on;
→ PHP-FPM:在http或server块加fastcgi_intercept_errors on; -
显式定义 location = /xxx.html:
必须单独配location = /404.html { root /usr/share/nginx/html; internal; }
等号不能少,root是目录,Nginx 自动拼成完整路径;internal防止用户直接访问该地址 -
文件存在且合规:
确认/usr/share/nginx/html/404.html存在、可读(chmod 644),且大小 ≥ 512 字节(IE 和部分旧客户端强制要求)
进阶用法:跳转、JSON、动态响应
不只是返回 HTML,还能灵活适配不同场景:
-
跳转到首页或外部地址:
error_page 404 = @tohome;location @tohome { return 302 /; }或return 302 https://example.com/; -
API 返回 JSON 错误体:
error_page 429 = @rate_limited;location @rate_limited { return 429 '{"code":429,"message":"Too many requests"}'; add_header Content-Type "application/json"; } -
按地区或设备差异化页面:结合
map指令和变量,例如用$geoip_country_code动态切换root路径
作用域与优先级注意点
配置位置影响生效范围:
- 写在
http块:全局默认,所有 server 继承 - 写在
server块:仅对该域名生效,推荐日常使用 - 写在
location块:只对匹配路径内的错误生效(如location /api/内的 404) - 不要写在
if块里——Nginx 不支持,会静默忽略










