有一次偶然的配置,发现nginx 在配置upstream的时候,
如果名字带有下划线,会导致前端返回400错误。
百度之后其他人好像也遇到了这个问题:
https://blog.csdn.net/horizon_zy/article/details/80139658
为什么会出现这种问题呢?
我们项目有很多的upstream配置,有的也是有下滑线的,为什么他们没有报错,就我们这里报错了。
改完之后(upstream为没有下划线的)
是因为升级了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
’
来源:CSDN
作者:我在写bug没事别打扰我
链接:https://blog.csdn.net/u010953880/article/details/103484967