Nginx自定义错误页及无法跳转问题解决


最近项目上需要在nginx上配置一个自定义400错误页,用于引导用户去下载新的证书文件。当时想这不是非常简单的事情?然而现实直接打脸。

首先附上主要的配置信息。

server {
#...
    proxy_intercept_errors on;
    fastcgi_intercept_errors on;
    error_page  400  /error400.html;
    location = /error400.html {
        root /home/nku/nginx/html/;
    }
#...
}

去错误页路径创建error400.hmtl文件,写入一些测试用的文字信息。如此简单的配完全不是问题哈,nginx -t测试通过,nginx -s reload重载新配置。

呃……好吧,这是为什么呢?先卖关子。首先解释一下proxy_intercept_errors和fastcgi_intercept_errors这两个字段都是用于自定义错误页时候使用的,它们可以使用在http, server, location模块里。

其中proxy_intercept_errors指定nginx是否拦截处理错误请求,但是如果服务器没有开启代理服务则字段无效。这个时候可以使用fastcgi_intercept_errors字段,这样错误也会跳转到自定义错误页。

fastcgi_intercept_errors指定nginx是否传递错误信息到客户端,或者是否允许nginx使用error_page的自定义错误页进行错误处理。

那么我的配置都写的是正确的,而且nginx已经正确的加载了配置文件并运行。为什么不能跳转到自定义的错误页呢。问题就在于nginx的错误提示页显示的错误码不是实际的错误码。通过查看nginx源码包中src/http/ngx_http_special_response.c对应错误页面上的信息得知,真正这个错误的错误码是496。

修改之前的自定义错误配置,nginx -t测试通过,nginx -s reload重载,测试通过。