可在 nginx 中通过 error_page 500 =500 /500.html; 自定义 500 错误页面,需确保文件存在、配置 internal 防直接访问,并启用 proxy_intercept_errors(如使用 proxy_pass)以正确拦截后端 500。

可以在 Nginx 中通过 error_page 指令自定义 500 错误响应,但需注意:500 是服务端内部错误,通常由上游(如 PHP-FPM、后端应用)触发,Nginx 本身不主动产生 500,而是透传或因自身配置错误(如 rewrite 循环、内存不足)生成。因此自定义 500 页面的关键在于拦截并重定向到指定资源,而非修改错误原因。
配置 error_page 拦截 500
在 server 或 location 块中使用 error_page 500 /500.html;,将所有 500 响应重定向到本地静态页面。该路径必须存在且可被 Nginx 访问(建议放在 root 目录下):
- 确保
/500.html文件真实存在,例如:/usr/share/nginx/html/500.html - 若使用相对路径,需与
root或alias指令配合;用绝对路径更稳妥 - 添加
location = /500.html { internal; }防止用户直接访问该页面
让自定义页面返回真实 500 状态码
默认情况下,error_page 重定向后会返回 200。要保持状态码为 500,需加 response 参数(Nginx 1.17.0+)或使用 return + error_page 组合:
- 推荐方式(新版):
error_page 500 =500 /500.html;—— 等号后=500强制维持状态码 - 兼容旧版:
error_page 500 /500.html; location = /500.html { return 500; },但需确保该 location 不再触发其他 error_page
结合 upstream 定制化处理
若 500 来自后端(如 FastCGI 或 proxy_pass),可在 upstream 区块中设置 max_fails 和 fail_timeout,并搭配 proxy_intercept_errors on; 启用错误页面接管:
-
proxy_intercept_errors on;必须开启,否则 Nginx 不会拦截后端返回的 500 - 搭配
error_page 500 /custom-500.html;才生效 - 注意:仅当后端响应体大于
proxy_buffer_size时可能失效,可调大缓冲区
调试与验证要点
自定义 500 易因配置顺序或权限问题失效,常见排查项:
- 检查 Nginx 配置语法:
nginx -t,重载:nginx -s reload - 确认日志中是否出现
open() "/path/500.html" failed (2: No such file) - 用 curl 测试:
curl -I http://your-site.com/trigger-500,观察响应头中的 Status - 临时在 location 中加
return 500;可快速验证 error_page 是否生效











