header头不能带下划线,避免header数据无法接收到

一个安卓朋友来问为啥自己发送的header头,PHP后端猿总是无法接收,这个问题让他纠结了一下午。其实原因很简单,PHP后端猿在写接口文档时,自定义header头中使用了下划线。

为何禁止在 HTTP HEADER 的字段名中使用下划线
不管是 Apache 还是 Nginx,都不能使用下划线作为字段名。

HTTP/1.1 的请求和响应消息使用 RFC 822 中的通用消息格式来传输实体(消息载荷)。
HEADER 字段名可由可打印的 ASCII 字符组成(也就是十进制值在 33 和 126 之间的字符,不含冒号)。
不含冒号很容易理解,因为 Field-Name 和 Value 之间需要用冒号分割。然而,我们通过查询 ASCII 码表可知,下划线的十进制 ASCII 值为 95,也在此范围之内!
其实,在 HEADER 字段名中使用下划线其实是合法的、符合 HTTP 标准的。

服务器之所以要默认禁止使用是因为 CGI 历史遗留问题。下划线和中划线都为会被映射为 CGI 系统变量中名中的下划线,这样容易引起混淆。

在 nginx 服务器中,通过显式地设置 underscores_in_headers on 可以开启在字段名中使用下划线。默认该选项是关闭的,所以在默认情况下,所有包含下划线的字段名都会被丢弃。

如何已开启此配置仍无法获取,查看是否存在代理服务器。

强烈建议不要在 HEADER 的 Field-Name 中使用下划线。

Tags: 笔记

添加新评论