nginx请求头中有下划线“_”丢失的问题

1,前言。

风平浪静的下午,一个前端开发同事找到我,说感觉好像nginx那边有一些转发并没有到达后端。

我问,怎么了?

她说的也非常具体,第一是常规访问服务,然后返回的状态是401,提示令牌失效(Token Invalid )。接着直接访问后端所代理的服务,然后就是正常的。

哦,听上去很明显啦,事儿就是到nginx这里卡住了呗。我问她详细的情况是怎样的?

她说获取验证码以及登陆都是没有问题的,但是就是这里的token没有传过去,token是放在请求头里边的,这个头的名称是“old_token”。

听上去一切好像都没什么问题,而这个问题也确实是我第一次遇到的,后来在某篇文章里找到了答案,这里粘贴过来,以存记录。

其实,在 HEADER 字段名中使用下划线其实是合法的、符合 HTTP 标准的。服务器之所以要默认禁止使用是因为 CGI 历史遗留问题。下划线和中划线都为会被映射为 CGI 系统变量中名中的下划线,这样容易引起混淆。

2,解决。

原本在测试环境测试通过的APP,今天准备切到线上环境做最后测试,结果发现了错误。查看日志发现是APP端发送的http请求中的header内容丢失了。那么代码没有改动,怎么平白无故会丢失头信息?

于是想到两个环境的不同之处在于线上是通过nginx做的代理转发,会不会是nginx搞的鬼?于是搜索“nginx request header 丢失”,果不其然是这个问题,nginx对下划线的头信息做了限制,找到问题所在就等于完成了一大半,办法总比困难多。遂决定记录之。

2.1不用下划线 。

既然nginx对下划线不支持,那没关系,不用下划线就是了。比如原来“old_token”改成”old-token“就可以了。(难怪一般header的name都是’-‘来拼接的,比如”User-Agent”) 。

2.2从根本上解除nginx的限制 。

nginx默认request的header的那么中包含’_’时,会自动忽略掉。

解决方法是:在nginx里的nginx.conf配置文件中的http部分中添加如下配置:

underscores_in_headers on;

默认 underscores_in_headersoff


刚好同事遇到此问题,在此摘录

未经允许请勿转载:程序喵 » nginx请求头中有下划线“_”丢失的问题

点  赞 (3) 打  赏
分享到: