[nginx]Tomcat接不到下划线Header的解决办法

2021-05-22 936点热度 0人点赞 0条评论

问题描述

Nginx转发给Tomcat的时候,发现一个问题,有一个名字叫User_Token的Header在Tomcat里始终获取不到,去掉nginx,直接让Tomcat接前端,就可以获取到这个Header

所以问题就应该出在Nginx这边,再仔细debug发现,如果把名字换成User-Token就可以了,所以就应该是这个User_Token下划线的问题。

问题解决

经过搜索,在nginx里有一个配置,叫:underscores_in_headers 这个默认值是off,就是带下划线的Header是不被认可的,我们只要在server下把这个值打开就可以了:

server {
  ## 其他配置忽略
  underscores_in_headers on;
  ## 其他配置忽略
}

其实,最标准的解决办法是修改程序,让程序发送的Header符合标准:首字母大写,中间隔开用下划线,让Nginx的配置使用默认值,提高程序在不同环境中的兼容性!

我们可以看到一般http请求的默认Header:

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,ja;q=0.5
Cache-Control: no-cache
Host: www.example.com
Pragma: no-cache
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36

nginx官方说法

If you do not explicitly set underscores_in_headers on;, NGINX will silently drop HTTP headers with underscores (which are perfectly valid according to the HTTP standard). This is done in order to prevent ambiguities when mapping headers to CGI variables as both dashes and underscores are mapped to underscores during that process.

这样做是为了避免把 headers 映射为 CGI 变量时出现歧义,因为破折号和下划线都会被映射为下划线,所以两者不好区分

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论