Http请求头中设置参数带有下划线传输获取不到值问题解决

写在前面

  最近在开发需求时,之前部署的一个项目,测试小姐姐说接口出了问题,然后查看日志发现是请求头中包含的两个命名含有下划线的参数没有传过去值,但是本地启动项目测试,并没有复现问题,但是测试环境下部署的项目就不行,多方查找,后来发现是nginx配置的问题,但是nginx配置没有权限修改,无奈只能更改了命名方式,最后问题得以解决。所以鉴于此,记录一下。

1、产生原因

为什么服务器会对下划线视而不见呢?后来查阅相关资料,发现如下说法:

在 RFC 2616 4.2 节中,有这样一段话:

Request (section 5) and Response (section 6) messages use the generic message format of RFC 822 [9] for transferring entities (the payload of the message).

大致意思说的是:HTTP/1.1的请求和响应消息使用 RFC 822 中的通用消息格式来传输实体(消息载荷)。

在 RFC 822 3.1.2节中,对于消息格式的说明,有这样一句话:

The field-name must be composed of printable ASCII characters (i.e., characters that  have  values  between  33.  and  126., decimal, except colon).

也就是说,HEADER 字段名可以由可打印的 ASCII 字符组成(也就是十进制值在 33 和 126 之间的字符,不含冒号)。不含冒号很容易理解,因为 Field-Name和Value之间需要用冒号分割。然而,我们通过查询 ASCII 码表可知,下划线的十进制 ASCII 值为 95,也在此范围之内!

这样也就是说,在 HEADER字段名中使用下划线其实是合法的、符合 HTTP 标准的。服务器之所以要默认禁止使用是因为 CGI 历史遗留问题。下划线和中划线都为会被映射为 CGI 系统变量名中的下划线,这样容易引起混淆。

2、问题解决

解决方案开始的时候也说了,可以通过修改nginx配置,也可以通过修改参数命名方式,避免使用下划线或者中划线命名变量。

1> nginx配置方案:

在nginx里的 nginx.conf文件中配置http的部分添加:

underscores_in_headers on

此配置可以开启在字段名中使用下划线。默认该选项是关闭的,所以在默认情况下,所有包含下划线的字段名都会被丢弃。因此强烈建议不要在 HEADER 的 Field-Name 中使用下划线。

2> 在header里不要用 “_” 下划线命名变量,可以使用驼峰方式进行命名。

参考文档:https://www.lovecto.cn/20190621/610.html

posted @ 2021-06-18 13:59  星空流年  阅读(1005)  评论(0编辑  收藏  举报