Nginx需满足四条件才能使FastCGI错误时显示自定义页:开启fastcgi_intercept_errors、error_page置于正确作用域、配置可访问且带internal的静态页location、错误页文件≥512字节。

要让 Nginx 在 FastCGI(比如 PHP)出错时显示自定义友好提示页,不能只写 error_page,必须满足四个硬性条件:拦截开关打开、指令位置正确、路径可访问、文件大小合规。否则页面不会生效,用户仍看到浏览器默认错误或空白。
必须开启 fastcgi_intercept_errors
这是最关键的一步。Nginx 默认把后端返回的 500、404 等状态码直接透传给浏览器,不走你配的 error_page。所以一定要在对应作用域加上:
- 全局生效:在
http块里加fastcgi_intercept_errors on; - 仅对某个站点生效:在
server块里加 - 如果同时用了反向代理(如 Node/Java),还需额外加
proxy_intercept_errors on;
error_page 指令要放在对的作用域
它只对“同级或子级”中由 FastCGI 处理的请求起作用。常见写法:
- 处理所有 PHP 接口错误:在
location ~ \.php$块内写error_page 500 /50x.html; - 统一处理整个站点的 FastCGI 错误:在
server块里写,但需确保该 server 下的 PHP 请求都走 FastCGI - 不要只写在
http块——它不会自动继承到 FastCGI location 中,除非显式继承或重复配置
静态错误页要能被内部定位且安全
例如配了 error_page 500 /50x.html;,那必须有对应 location = /50x.html 来承接这个内部跳转:
location = /50x.html { root /usr/share/nginx/html; internal; }-
internal是必须的,防止用户直接访问/50x.html暴露错误页 URL - 真实路径是
/usr/share/nginx/html/50x.html,检查文件存在且 Nginx 进程有读权限:ls -l /usr/share/nginx/html/50x.html - 文件内容不能太短——Nginx 要求至少 512 字节,否则会忽略自定义页,退回默认提示
进阶:用 PHP 脚本统一处理并通知
如果需要在报错时发邮件、记日志、再跳转,建议把 error_page 指向一个 PHP 脚本:
error_page 500 /error-handler.php?code=500;location = /error-handler.php { fastcgi_pass php-fpm; include fastcgi_params; }- PHP 脚本里可以判断
$_GET['code'],记录错误、触发告警,最后用header('Location: https://xxx.com/error'); exit;完成跳转 - 这样比纯静态页更灵活,也避免暴露后端细节


















