Nginx配置自定义错误页面需同时满足四条件:error_page指令置于正确作用域(server或对应location)、开启proxy_intercept_errors或fastcgi_intercept_errors、location = /404.html中root路径真实可读且含internal、错误页文件大小≥512字节并声明text/html MIME类型。

在 Nginx 中配置自定义错误页面,核心是用 error_page 指令把状态码映射到内部路径,并确保该路径能被正确响应。只写一行 error_page 404 /404.html 是不够的,必须同时满足四个条件:指令位置对、拦截开关开、路径可读、文件大小达标。
必须开启对应的错误拦截开关
Nginx 默认不接管后端返回的错误状态码,会直接透传给浏览器。所以无论你怎么配 error_page,没开拦截,就等于没配。
- 后端是 PHP(FastCGI):加
fastcgi_intercept_errors on; - 后端是反向代理(如 Node.js、Java、Python):加
proxy_intercept_errors on; - 两者共存?两个都加上,互不影响
error_page 要放在正确的作用域里
配置位置决定它管谁。写错地方,可能完全不生效,或只对部分请求起作用。
- 静态资源 404(比如访问
/img/logo.png但文件不存在):写在server或根location /块里即可 - API 接口返回 502:必须在该
location /api块内同时写error_page 502 /50x.html和proxy_intercept_errors on; - 全局统一处理:写在
http块,所有server都继承;子块可覆盖
静态页路径要真实存在且可读
error_page 404 /404.html 后面的 URI 是内部跳转路径,不是文件系统路径。它需要靠 location = /404.html 来承接,并通过 root 拼出真实文件位置。
- 示例:
location = /404.html { root /usr/share/nginx/html; internal; }→ 实际查找路径是/usr/share/nginx/html/404.html - 务必加
internal;,防止用户直接访问/404.html绕过正常流程 - 检查文件是否存在:
ls -l /usr/share/nginx/html/404.html - 确认 Nginx worker 进程(如
www-data)有读权限:chmod 644 /path/404.html
文件本身有隐藏门槛
就算前面全对,页面仍不显示?大概率卡在这两个细节上:
- IE 和部分旧客户端要求自定义错误页体积 ≥ 512 字节,否则强制用浏览器内置页。用
wc -c /path/to/404.html确认 - MIME 类型要对。确保配置中启用了
include mime.types;,或在 location 中显式声明:types { text/html html; }


















