nignx转发http请求,未读取自定义请求头key-value

​ 使用Golang想服务端发送post请求时,携带了Token,但是服务器返回不是同一用户的消息。

1
2
3
4
5
6
7
8
resp, body, errs := gorequest.New().
Post(config.CreateOrderUrl).
Set("ext_key",token).
Set("Content-Type","application/json").
Set("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36").
Send(myOrder).
End(printStatus)
fmt.Println(resp,body,errs)

收到{“code”:200,”data”:{},”msg”:”不是同一个用户”,”type”:”nothing”}。

通过查看nigix日志看到错误信息如下:

1
client sent invalid header line: "Ext_key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIweGYxMzI2YTZmZTg5YjU2OWY5OTI1NzgyMjhlYTgwMWEzMzljOTRmNjgiLCJpYXQiOjE2MzUxNDg1MTAsImV4cCI6MTYzNTE1MjExMH0.5viZYTJuCs5PQJA9OfhxPps9nwWpyRd9S56kmqpHBYM" while reading client request headers

client sent invalid header line的意思是客户端发送了无效的标题行。因此问题出现在Ext_key这个键上。

通过查询源码发现。nigix果然处理了带有下划线的Key,是对下划线做了忽略处理,而不是不进行转发。

深入了解忽略的原因,看看是否是因为安全而做了忽略处理,发现在 HEADER字段名中使用下划线其实是合法的、符合 HTTP 标准的。服务器之所以要默认禁止使用是因为 CGI 历史遗留问题。下划线和中划线都为会被映射为 CGI 系统变量名中的下划线,这样容易引起混淆。

上网查了下,说在 nginx 的 http 模块下 添加一个参数即可:
参数如下:【underscores_in_headers on】如果需要添加带有下划线的请求头,就需要将underscores_in_headers 设置为 on。

然后重启生效即可。