要使nginx拦截php返回的4xx/5xx错误并展示自定义页面,必须启用fastcgi_intercept_errors on;,再配合error_page指令绑定错误码与资源(如error_page 500 /500.html),且静态页需存在并设internal防止直接访问,或指向php脚本动态处理。

当后端是 PHP(通过 FastCGI 运行)时,Nginx 默认会把 4xx/5xx 错误原样透传给客户端,不触发 error_page。要让 Nginx 拦截这些错误并展示自定义页面,必须显式开启拦截开关,并配合 error_page 指令。
启用 FastCGI 错误拦截
在 http、server 或 location 块中添加:
fastcgi_intercept_errors on;
该指令告诉 Nginx:当 FastCGI 后端返回 4xx 或 5xx 状态码时,不要直接返回给用户,而是交由 error_page 处理。注意:它本身不定义页面,只是“放行拦截权限”——没它,error_page 500 /500.html 就不会生效。
绑定错误码与自定义资源
在同级或更内层作用域(如 server 块)中配置 error_page:
error_page 404 /404.html;error_page 500 502 503 504 /50x.html;
确保对应 HTML 文件存在于 root 路径下(例如 /usr/share/nginx/html/404.html)。推荐为这些 location 加上 internal; 防止用户直接访问:location = /404.html { internal; root /usr/share/nginx/html; }
用 PHP 脚本动态生成错误页(可选进阶)
若需根据错误类型、请求路径、时间等动态输出内容(比如记录日志、显示调试信息),可将错误指向 PHP 脚本:
error_page 500 /error.php;- 在
location ~ \.php$块中确保已配置 FastCGI 传递(如fastcgi_pass unix:/run/php/php-fpm.sock;)
脚本中可通过 $_SERVER['REDIRECT_STATUS'] 获取原始错误码,再渲染响应。注意不要暴露源码,且该 URI 应仅由 error_page 触发,不建议开放 GET 直接访问。
常见踩坑点
以下配置容易失效,需逐一核对:
-
fastcgi_intercept_errors必须开启,且作用域覆盖到实际处理 PHP 的 location -
error_page不能写在错误的嵌套层级(比如只写在某个特定 location 里,但错误发生在其他 location) - 静态 HTML 页面路径不对、权限不可读、MIME 类型未被识别(Nginx 会自动设为 text/html,一般无需额外加
types) - 如果用了
=200(如error_page 500 =200 /50x.html),状态码会被覆盖为 200,SEO 和调试时不推荐











