nginx自定义错误页需同时满足四个条件:error_page配置正确、对应拦截开关(fastcgi_intercept_errors或proxy_intercept_errors)开启、静态资源路径可访问且权限正确、文件大小≥512字节;缺一不可。

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











