Nginx 自定义错误页需用 error_page 指令绑定错误码与 URI,并通过 internal location 限制直接访问;反向代理需启用 fastcgi_intercept_errors 或 proxy_intercept_errors;高版本支持直接返回 JSON 或修改状态码。

在 Nginx 中设置自定义 404 和 500 错误页,核心是用 error_page 指令配合 location 块完成内部重定向,并确保错误页面能被安全、正确地响应。
基础配置:绑定错误码与静态页面
在 server 块中添加以下配置:
-
error_page 404 /404.html;—— 将所有 404 请求内部重定向到/404.html -
error_page 500 502 503 504 /50x.html;—— 把常见服务端错误统一指向一个维护页
注意:error_page 后的路径是 URI,不是文件系统路径;它必须由某个 location 块匹配并响应,否则会返回 500。
安全响应:限制直接访问错误页
为防止用户手动请求 /404.html 或 /50x.html,需用 internal 限定:
location = /404.html { internal; root /usr/share/nginx/html; }location = /50x.html { internal; root /usr/share/nginx/html; }
root 表示文件根目录,Nginx 会拼接为 /usr/share/nginx/html/404.html;若用 alias,要注意末尾斜杠和路径对齐(例如 alias /usr/share/nginx/html/;)。
反向代理场景:拦截后端错误
当 Nginx 作为反向代理时,后端(如 PHP-FPM、Tomcat)返回的 404/500 默认不会触发 error_page,需显式开启拦截:
- 对 FastCGI(PHP):在
http或server块中加fastcgi_intercept_errors on; - 对普通代理(HTTP 后端):加
proxy_intercept_errors on;
不开启这两项,后端返回的错误状态会被透传给客户端,自定义页面将不生效。
进阶用法:返回 JSON 或修改状态码
如果接口需要返回结构化错误响应(如 REST API),可跳过 HTML 页面,直接返回内容:
-
error_page 404 =404 '{"error":"Not found"}';—— 返回 JSON,状态码保持 404 error_page 403 =403 '{"error":"Forbidden"}';-
error_page 404 =200 /404.html;—— 显示友好页面,但响应码改为 200(慎用,影响 SEO 和调试)
这类写法要求 Nginx ≥ 1.13.7,且无需额外 location 块。











