nginx自定义返回状态

领导要求在响应失败的时候也返回200以保证不影响客户网站,这个在F5中很容易的实现,只要一句话就可以了,但是nginx中稍微麻烦了点,要答案的直接看下面这个语句就可以了,加到每个server中就可以了。

1
2
3
4
5
6
proxy_intercept_errors on; 
error_page  404 400 500 503 502 =200 @handler;
location @handler {
default_type text/plain;
return 200;
}

至于为什么,还有没有别的方法且看下面。 本来想用 if语句来实现,但是发现根本不生效,因为无论server_status还是upstream_status出来的时候都已经返回给用户端了。所以下面的代码根本没有效果

1
2
3
4
if ($upstream_status ~ (400|404|500|503|502)){ 
returen 200;
break;
}
1
2
3
4
if ($server_status ~ (400|404|500|503|502)){ 
returen 200;
break;
}

上面两种代码都是没有效果的。那error_page还有别的实现方式吗? 当然有。

1
2
proxy_intercept_errors on; 
error_page  404 400 500 503 502 =200 /200.html;

可这样不是每个server都要建立一个本地主机,因为我前端都是proxy,每个server都建立也挺麻烦。要么每个后端都要加一个200.html,可后端本来都无法响应了,你加来又有何用呢。 最上面的那个代码为什么要加default_type text/plain; 这句呢。因为当用户默认输错,我们无法判断会有用户输入什么,当不是html或者图片啥的,那就会提示用户下载,那也无法体现我们的需求,所以必须强制加一句这个。