解决NGINX(或后端代码中获取Header)中自定义带下划线的参数无法获取的问题

    因某个需求,在请求后端时,自定义了header参数,并且参数名是带下划线_的时候,无论在nginx的配置conf中直接获取或者后端代码中获取header时,此带下划线的参数都是(默认)无法获取的。 解决办法也很简单: 一、若自定义的Header的参数允许改名,那就直接改名,不要带下划线; 二、若不允许直接改参数名或改参数名的代价太大,那就改NGINX的配置:只需要在NGINX的配置中,加上一句:underscores_in_headers on 即可。

    具体原因为以下(解释摘自网络): 在 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 系统变量名中的下划线,这样容易引起混淆。 在 nginx 服务器中,通过显式地设置: underscores_in_headers on; 可以开启在字段名中使用下划线。默认该选项是关闭的,所以在默认情况下,所有包含下划线的字段名都会被丢弃。因此强烈建议不要在 HEADER 的 Field-Name 中使用下划线。

相关文章
通过rsyslog实现Nginx日志统一收集nginx的location规则与rewrite解析这么配置Nginx,使其变成高性能服务器隐藏nginx的版本终于搞定在nginx上支持.htaccess伪静态了WordPress的Nginx伪静态规则基础篇:CentOS常用命令收藏
    标签:Nginx 发布于:2022-02-03 18:45:18

当前共有0条评论,我也要发表:

    我的名字:

    我的邮箱: