最近项目上需要在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重载,测试通过。