nginx反向代理不转发自定义header
最近有个项目要对接硬件设备,设备通过http请求连接服务器,但设备的协议自定义了一些header参数,而且这些header参数名的定义还TM违反了HTTP协议的标准规范用了下划线符号。
开始以为只要简单在nginx配置文件加个配置就解决:
underscores_in_headers on;
默认nginx配置underscores_in_headers为off,即不支持自定义header参数带有下划线的。
事情永远没有这么简单,我开始把underscores_in_headers on;加到了server层,因为只是某一个接口用到这些参数,并且把第一层反向代理和后端服务器的nginx都加上了这个配置。
用postman模拟测试转发header参数正常,后端服务器参能接收到自定义的header参数。
但在硬件上测试,后端服务器通过tcpdump拦截到的数据包居然还是收不到自定义的header参数,这就怪事了,平常怪事虽不少,但今年特别多。
过程中我又用php的fsockopen来模拟跟postman一模一样的发送请求,但居然还是转发不了header自定义参数,大家不用怀疑,因为我是根据tcpdump拦截到的数据一比一的模拟的。崩溃吧!!!
为了转发这个不规范的自定义header参数,我甚至用到了proxy_set_header,想把参数转发到后端服务器。
proxy_set_header dev_id $http_dev_id;
然而依然没有什么卵用!还是获取不到参数。
多次尝试,实在没有头绪的情况下我试着把underscores_in_headers on;参数改放到了nginx配置文件的http层,神奇的事情就发生了,居然正常了Orz
所以。。。呃。。。就这样吧,但为何postman模拟发请求正常仍然是一个不解之迷。。。
记录一下,可能也会有遇到同样踩了这坑的同学。nginx真是个神奇的产物!