请求接口Header参数带下划线,Nginx反向代理后参数丢失
发生业务场景
因为公司项目对接外部公司的流程接口,这块工作由我的另外一位同事来完成,
在本地开发环境进行测试能够正常进行访问,但是发布的UAT环境后发现发现开发实现的功能不能正常使用,
请求即可虽然是200状态码,但是返回的数据不对。开始一直怀疑是部署环境有问题,
询问其他同事也没有好的解决办法,结果到下午后他与另外一位同事交流说是不是请求头丢失导致的。
结果“**==一语惊醒梦中人==**”。
发送问题的本质原因
-
最后追踪到问题的本质原因是因为第三方公司在头部请求参数比较特殊,参数里面带了下换线(==_==) -
为了统一调用转发在Nginx里面进行了相关的配置,默认Nginx Header参数下换线被忽略 默认情况下,并不是所有headers的fields它都会转发,fields里带有下划线(_)的,Nginx视为不合法,自动抛弃不发了。例如:AUTHORIZATION_TOKEN
解决办法
1.不使用下划线 目前别人这个功能已经上线在使用之中,让对方修改不太现实。 2.此接口在后端写一个转发方式,不走Nginx直接调用应该可行 3.修改Nginx的相关配置是的支持头部下换线参数 想要支持下划线()的headers fields,就需要将underscores_in_headers设置为on;默认是offNGINX配置添加红框部分,并重启Nginx 4、尝试办法在Nginx代理之之中加上头部请求信息(不起作用) 方法一:NGINX代理时加上请求头信息: location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://域名/api/v1/abc; } 由于前端代码request的header中包含====,所以这个配置没有生效
试验可行方案
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
underscores_in_headers on;#解决代理时请求头丢失问题
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
总结
解决问题的时候,需要细心发现问题本质原因,需要观察问题发送的细节原因,另外需要适当的时候与其他同事交流,也许当前发送的问题其他同事可能遇见过。一句话话就容易减少走很多弯路。有相应的解决方案后多实践试验。
另外在实际开发之中 **==尽量不要使用下划线参数作为header参数==**
参考文章
NGINX反向代理,header丢失的问题
nginx反向代理导致请求header头信息丢失
|