欢迎光临白事网
详情描述

error_page的配置和常见问题解决方案。

一、error_page基础配置

1. 基本语法

error_page code [code...] [=response] uri;

2. 常见配置示例

http {
    # 全局错误页面
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    server {
        listen 80;

        # 指定错误页面的位置
        location = /404.html {
            root /usr/share/nginx/html;
            internal;
        }

        location = /50x.html {
            root /usr/share/nginx/html;
            internal;
        }
    }
}

二、常见问题及解决方案

问题1:error_page不生效

可能原因及解决方案:

# 错误:使用了proxy_intercept_errors off(默认值)
location / {
    proxy_pass http://backend;
    proxy_intercept_errors off;  # ← 这会导致错误不被nginx拦截
}

# 正确:开启错误拦截
location / {
    proxy_pass http://backend;
    proxy_intercept_errors on;  # ← 关键设置
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
}

问题2:重定向死循环

# 错误:可能导致重定向循环
error_page 404 /404.html;  # 如果404.html本身不存在,会无限循环

# 解决方案1:确保错误页面存在
location = /404.html {
    root /var/www/html;
    internal;  # 防止直接访问
}

# 解决方案2:使用绝对路径
error_page 404 http://example.com/custom-404.html;

# 解决方案3:设置状态码
error_page 404 =200 /404.html;  # 返回200状态码

问题3:代理后端错误不显示自定义页面

server {
    listen 80;

    location / {
        proxy_pass http://backend;
        proxy_intercept_errors on;  # 必须开启

        # 处理后端返回的错误
        error_page 404 = @fallback;
        error_page 500 502 503 504 = @maintenance;
    }

    location @fallback {
        # 返回静态错误页面
        root /var/www/error_pages;
        try_files /404.html =404;
    }

    location @maintenance {
        root /var/www/error_pages;
        try_files /50x.html =500;
    }
}

问题4:动态错误处理

# 使用命名location处理错误
error_page 404 @error_handler;

location @error_handler {
    # 记录到日志
    access_log /var/log/nginx/errors.log;

    # 重写到PHP处理程序
    rewrite ^ /error.php?code=$status last;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php-fpm.sock;
    include fastcgi_params;
    fastcgi_param REQUEST_URI $request_uri;
    fastcgi_param ERROR_CODE $status;
}

问题5:不同状态码的统一处理

# 捕获多个状态码
error_page 401 403 404 /error.html;

location = /error.html {
    internal;
    root /usr/share/nginx/html;

    # 根据状态码显示不同内容
    if ($status = 401) {
        set $error_msg "需要登录";
    }
    if ($status = 403) {
        set $error_msg "禁止访问";
    }
    if ($status = 404) {
        set $error_msg "页面不存在";
    }

    # 可以在HTML中通过变量显示:$error_msg
}

三、高级配置示例

1. 根据请求类型返回不同格式

map $http_accept $error_format {
    default "html";
    "~application/json" "json";
    "~application/xml" "xml";
}

server {
    error_page 404 = @error;

    location @error {
        # 根据Accept头返回不同格式
        if ($error_format = "json") {
            return 404 '{"error": "Not Found", "code": 404}';
        }
        if ($error_format = "xml") {
            return 404 '<?xml version="1.0"?><error><message>Not Found</message><code>404</code></error>';
        }

        # 默认返回HTML
        root /var/www/errors;
        try_files /404.html =404;
    }
}

2. 维护模式配置

# maintenance.conf
error_page 502 503 504 /maintenance.html;

location = /maintenance.html {
    root /usr/share/nginx/html;
    internal;
}

# 在需要维护时使用
if (-f /var/www/maintenance.flag) {
    return 503;
}

3. 完整示例配置

http {
    # 定义错误页面根目录
    error_page 404 /error/404.html;
    error_page 500 502 503 504 /error/50x.html;
    error_page 403 /error/403.html;

    server {
        listen 80;
        server_name example.com;

        # 错误页面目录
        location ^~ /error/ {
            internal;
            root /var/www/html;
        }

        # 主要应用
        location / {
            proxy_pass http://backend;
            proxy_intercept_errors on;

            # 错误处理
            error_page 404 = @not_found;
            error_page 500 502 503 504 = @server_error;
            error_page 403 = @forbidden;
        }

        # 自定义错误处理location
        location @not_found {
            # 可以记录日志、统计等
            access_log /var/log/nginx/404.log;

            # 返回自定义页面
            return 302 /error/404.html;
        }

        location @server_error {
            # 发送警报邮件(通过脚本)
            # ...

            # 返回错误页面
            root /var/www/html/error;
            try_files /50x.html =500;
        }

        location @forbidden {
            # 重定向到登录页面
            return 302 /login?return_url=$request_uri;
        }
    }
}

四、调试技巧

1. 检查配置

# 检查语法
nginx -t

# 详细测试配置
nginx -T

# 重新加载配置
nginx -s reload

2. 查看日志

# 查看错误日志
tail -f /var/log/nginx/error.log

# 查看访问日志中的错误
grep " 50[0-9] " /var/log/nginx/access.log

3. 测试错误响应

# 测试404
curl -I http://localhost/nonexistent

# 测试500错误
curl -I http://localhost/trigger-error

五、最佳实践建议

始终设置proxy_intercept_errors on 当使用反向代理时 使用internal指令 防止错误页面被直接访问 确保错误页面文件存在 并且有正确的权限 考虑错误页面的缓存策略 记录错误到日志 便于分析 根据业务需求定制错误页面 提供更好的用户体验

需要根据你的具体业务场景选择合适的配置方式。

相关帖子
普通人每天进行2小时体育活动,长期坚持可能会带来哪些身体变化?
普通人每天进行2小时体育活动,长期坚持可能会带来哪些身体变化?
如果免签入境期间护照不慎遗失,正确的处理流程和求助渠道有哪些?
如果免签入境期间护照不慎遗失,正确的处理流程和求助渠道有哪些?
有没有让高跟鞋鞋底变得更柔软舒适的日常小技巧?
有没有让高跟鞋鞋底变得更柔软舒适的日常小技巧?
宜昌市网站维护#网站建设,高端网站开发设计
宜昌市网站维护#网站建设,高端网站开发设计
国内油价调整机制在2026年可能会有哪些方面的优化
国内油价调整机制在2026年可能会有哪些方面的优化
hpsysdrv.exe是什么进程?hpsysdrv.exe是病毒吗?
hpsysdrv.exe是什么进程?hpsysdrv.exe是病毒吗?
汕尾市AI数字人制作小视频#企业网站建设公司,专业开发团队
汕尾市AI数字人制作小视频#企业网站建设公司,专业开发团队
湘潭市小视频制作与剪辑&商城网站定制,专业设计团队
湘潭市小视频制作与剪辑&商城网站定制,专业设计团队
coreldraw怎么勾画轮廓图?coreldraw勾画轮廓图方法
coreldraw怎么勾画轮廓图?coreldraw勾画轮廓图方法
Pandas索引器 loc 和 iloc 比较及代码示例
Pandas索引器 loc 和 iloc 比较及代码示例
MYSQL的日志文件详解
MYSQL的日志文件详解
益阳市殡葬一条龙公司电话|家庭白事服务,24小时服务热线
益阳市殡葬一条龙公司电话|家庭白事服务,24小时服务热线
2026年婚纱租赁店的卫生管理,是否有相关的行业规范或标准可以参考?
2026年婚纱租赁店的卫生管理,是否有相关的行业规范或标准可以参考?
面对一些生活必需品的价格波动,普通家庭可以采取哪些策略来平稳开支?
面对一些生活必需品的价格波动,普通家庭可以采取哪些策略来平稳开支?
手机号不再使用,但忘记绑定了哪些应用,有什么方法可以全面查询和解绑?
手机号不再使用,但忘记绑定了哪些应用,有什么方法可以全面查询和解绑?
对于网络上流传的历史类或社会类文章,普通读者可以从哪些角度评估其可信度?
对于网络上流传的历史类或社会类文章,普通读者可以从哪些角度评估其可信度?
Tomcat服务器日志超详细讲解
Tomcat服务器日志超详细讲解
AJAX POST数据中有特殊符号(转义字符)导致数据丢失的解决方法
AJAX POST数据中有特殊符号(转义字符)导致数据丢失的解决方法
明明知道熬夜不好,为什么就是控制不住自己?如何克服报复性熬夜?
明明知道熬夜不好,为什么就是控制不住自己?如何克服报复性熬夜?
不同城市间关于父母随迁落户的具体执行细则,主要差异体现在哪里?
不同城市间关于父母随迁落户的具体执行细则,主要差异体现在哪里?