Nginx在server块中定制错误页面需同时满足四条件:error_page必须置于server块实现域名隔离、错误页文件真实存在且权限正确、对应location显式放行并设internal、反向代理/FastCGI场景须启用proxy_intercept_errors或fastcgi_intercept_errors。

在 Nginx 的 server 模块中定制错误页面,核心是用 error_page 指令配合 location 块精准控制响应行为。这不是加一行就生效的简单操作,而是需要同时满足路径、权限、作用域和拦截机制四个关键条件。
必须写在 server 块内,按域名隔离配置error_page 放在 server 块里,只影响该虚拟主机。比如:
server {
listen 80;
server_name example.com;
root /var/www/html;
error_page 404 /404.html;
error_page 500 502 503 504 /5xx.html;
location = /404.html {
internal;
root /var/www/html;
}
location = /5xx.html {
internal;
root /var/www/html;
}
}internal 表示只允许内部重定向访问,防止用户直接请求 /404.html 暴露错误页结构。
错误页文件要真实存在且可读
- 文件必须放在
root指定的目录下,例如/var/www/html/404.html - 确保 Nginx 工作进程(如
www-data或nginx用户)有读权限:chmod 644 /var/www/html/404.html chmod 755 /var/www/html
- 不要用绝对路径写在
error_page后,比如error_page 404 /usr/share/nginx/html/404.html是错的——Nginx 会把它当 URI 处理,导致 404 套娃。
反向代理或 FastCGI 场景需开启拦截开关
- 如果后端(如 Tomcat、Node.js、PHP-FPM)返回 404/500,Nginx 默认透传状态码,不触发本地
error_page。 - 必须在对应
location块中显式启用拦截:- 反向代理:加
proxy_intercept_errors on; - PHP 场景:加
fastcgi_intercept_errors on;
- 反向代理:加
否则你配了也看不到自定义页。
静态资源(图片/CSS)要能正常加载
- 错误页里的
<img src="/img/404.jpg">依赖主站的静态资源配置;最稳妥方式是把所有资源和 HTML 放同一目录,用相对路径引用:<img src="404-bg.jpg" alt="Not Found">
- 并确保
location = /404.html的root覆盖该目录,Nginx 才能一并服务这些资源。
验证与生效步骤不能跳过
- 修改后先测试语法:
nginx -t - 再热重载:
nginx -s reload - 测试时用
curl -I http://example.com/nonexistent看状态码和Content-Type是否正确,避免浏览器缓存干扰。


















