关于nginx请求头中有下划线_的坑
# 1,前言。
风平浪静的下午,一个前端开发同事找到我,说感觉好像 nginx 那边有一些转发并没有到达后端。
我问,怎么了?
她说的也非常具体,第一是常规访问服务,然后返回的状态是 401,提示令牌失效(Token Invalid
)。接着直接访问后端所代理的服务,然后就是正常的。
哦,听上去很明显啦,事儿就是到 nginx 这里卡住了呗。我问她详细的情况是怎样的?
她说获取验证码以及登陆都是没有问题的,但是就是这里的 token 没有传过去,token 是放在请求头里边的,这个头的名称是“old_token
”。
听上去一切好像都没什么问题,而这个问题也确实是我第一次遇到的,后来求助百度,在某篇文章里找到了答案,这里粘贴过来,以存记录。
# 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_headers 为off
。
我们采取了第一种方法,她更改了一下请求头的名称,果然这个问题就解决了。
参考链接:https://blog.csdn.net/Nazir2513/article/details/70889319