nginx upstream 中带下划线bug,前端会报400错误

有一次偶然的配置,发现nginx 在配置upstream的时候,

如果名字带有下划线,会导致前端返回400错误。

 

百度之后其他人好像也遇到了这个问题:

https://blog.csdn.net/horizon_zy/article/details/80139658

 

为什么会出现这种问题呢?

我们项目有很多的upstream配置,有的也是有下滑线的,为什么他们没有报错,就我们这里报错了。

nginx upstream 中带下划线bug,前端会报400错误_第1张图片

改完之后(upstream为没有下划线的)

nginx upstream 中带下划线bug,前端会报400错误_第2张图片

 

是因为升级了SpringBoot版本导致了该问题,又因为是http的头部变化导致的问题,故可以大胆猜测是因为升级了Tomcat版本导致的该问题。

 

为什么新版的tomcat为什么出现这个问题?

在SpringBoot项目的issue中搜索了下400问题,发现确实有相关的issue。

https://github.com/spring-projects/spring-boot/issues/13236

虽然看上去跟我们的问题是一样的,都是400问题,但是具体发生的原因是不一样的。这个issue是说,如果domain name .ext 包含数字,比如 “domain.sf1m”,会出现400问题。这个问题也已经在tomcat的新版本中修复了。

带有下划线的Host的http请求,tomcat认为是有问题

那为什么之前版本的tomcat是正常的呢?

新版本的tomcat对这个头部进行了校验,旧版本没有校验。

好了,到这里我们就知道了,其实对于带有下划线的Host,tomcat是遵循的RFC1-1034的规范的,所以tomcat的处理是正确的。

但是tomcat在处理某些其他合法的Host的时候历史上出现过bug,但是对于下划线的处理一直是正确的。

所以,以后nginx在配置upstream的时候不能使用带有下划线的名称,还有最好在location位置上加上proxy_set_header HOST $host

 

nginx在没有配置proxy_set_header HOST $host 的时候,在转发http请求的时候会默认把upstream的名称作为Host头部的内容。

也就是说新版的tomcat在接收Host为sc_java(带有下划线)的http请求报了400错误

 

proxy_set_header HOST $host

这个配置是啥意思?

这个配置的主要是在nginx在转发htp请求的时候会加上实际的Host请求头。如http请求是 http://abc.com/hello,那么nginx在转发http请求的时候会原封不动的把host请求头(Host:abc.com)转发给后台服务。对于nginx而言,如果没有配置proxy_set_header HOST $host的时候会默认修改Host为upstream的名称。

 

我这里也是偶然看到这个大神的文章,说的很详细,才想者整理下原因:

大神的文章地址:https://mp.weixin.qq.com/s/A7j4lGshzfg2quE0Tzz8lQ

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Nginx,nginx,400,upstream)