1.问题
新增的几个 header 参数是这样的:
- api_key_id
- api_key_value
我配置有2层nginx转发,从机器A到机器B再到目标服务,遇到一个接口请求需要在header中传递api_key_id和api_key_value这2个参数,但是在EC2机器上直接curl目标服务的api url是可以的,运行的命令:
curl -k -v -X GET 'https://676eea277d90484b8142-cn-heyuan-acdr-1-vpc.alicloudapi.com/v1/accounts/1248622328516666' --header 'api_key_id: 111923335' --header 'api_key_value: f540033e6cc8429f801dc2734ad261ea'
但是通过从机器A到机器B再到目标服务这个链路却不行,这个链路的命令:
curl -k -v -X GET https://baidu.net/dev/tlpssp/uesrapi/v1/accounts/1248622328517708 -H "api_key_id:111923335" -H "api_key_value:f540033e6cc8429f801dc2734ad261ea"
总是返回401,检查了配置location都没有问题,但是目标服务后端打印出来的参数,是没有api_key_id和api_key_value这2个参数的。
猜测:
api_key_id和api_key_value这2个参数传递过程中丢失或则根本没传递
2.解决
于是各种google发现,是nginx配置的问题,终于找到了一个 Nginx 的配置参数:underscores_in_headers,这个参数默认值为:off,即默认忽略带下划线的 header。
最终解决方案:
1、在 http 或者 server 配置中把 underscores_in_headers 配置参数开关打开:
server {
...
underscores_in_headers on;
...
}
增加配置后,然后重启 Nginx。
2、使用破折号(-)代替下划线(_),或者统一规范直接不要使用下划线;
一般所见的 headers 确实也都是中杠线,没有下划线。
本文最终选择的是方案1,也就是增加配置: underscores_in_headers on;