最近遇到了一个N??ginx转发的坑。向Tomcat转发请求时,发现有几个http头获取不到,导致线上出现bug。运维说不是他的问题。新增的headers如下:accept_signaccept_token...反复检查代码,确保这些headers都通过了,本地测试单独在tomcat中可以接受这些参数,所以tomcat和命名本身是没有问题的,是的初步判断是Nginx的问题。经过查找,终于找到了一个N??ginx的配置参数:underscores_in_headers。该参数默认值为off,即默认忽略带下划线的header。解决方法:1、在http或server配置中开启underscores_in_headers配置参数开关:server{...underscores_in_headerson;...}添加配置后,重启Nginx。2.使用破折号(-)代替下划线(_),或者在统一规范中不直接使用下划线;我们看看一般的httpheader长什么样子:一般看到的header确实是中间的横条,没有下划线。为什么Nginx默认会忽略带下划线的header?我找到了Nginx的官方说明:https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/?highlight=underscores#missing-disappearing-http-headers如果你没有明确设置underscores_in_headerson;,NGINX将静默丢弃带有下划线的HTTP标头(根据HTTP标准,这是完全有效的)。这样做是为了防止在将标头重新映射到CGI变量时出现歧义,因为在该过程中将破折号和应用程序都映射为下划线。按照官方的说明,这样做是为了避免在将headers映射到CGI变量时出现歧义,因为破折号和下划线会映射到下划线,所以两者不容易区分……好吧,我终于想通了,这个问题太变态了。这应该是Nginx设计上的一个缺陷。我给你踩了这个坑!因此,我建议您使用第二种解决方案。统一headers不使用下划线,使用Nginx的默认配置即可,尽量避免环境差异,从而避免后续出现问题。本文转载自微信公众号《Java技术栈》,可通过以下二维码关注。转载本文请联系Java技术栈公众号。
