HTTP标头是否区分大小写?

在博客文章中,我使用以下PHP来设置响应的内容类型:

header('content-type: application/json; charset=utf-8'); 

我刚刚对该帖子发表评论说, content-type需要大写, Content-type 。 它是否正确? 它似乎对我来说都是小写的,我认为HTTP头是不区分大小写的。 还是只是因为浏览器很好?

从RFC 2616 – “超文本传输​​协议 – HTTP / 1.1” , 第4.2节“消息头” :

每个标题字段由一个名字后跟一个冒号(“:”)和字段值组成。 字段名称不区分大小写。

RFC 7230的更新没有列出这部分RFC 2616的任何更改 。

根据RFC 2616 ,HTTP标头名称不区分大小写。

4.2:

每个标题字段由一个名字后跟一个冒号(“:”)和字段值组成。 字段名称不区分大小写。

(字段可能区分大小写,也可能不区分大小写)

如果你信任主要的浏览器遵守这一点,你就全部设置好了。


顺便说一句,不像大多数的HTTP,方法(动词) 区分大小写的:

5.1.1方法

方法标记指示要在该方法上执行的方法
由Request-URI标识的资源。 该方法是区分大小写的。

  Method = "OPTIONS" ; Section 9.2 | "GET" ; Section 9.3 | "HEAD" ; Section 9.4 | "POST" ; Section 9.5 | "PUT" ; Section 9.6 | "DELETE" ; Section 9.7 | "TRACE" ; Section 9.8 | "CONNECT" ; Section 9.9 | extension-method extension-method = token 

header('Content-type: image/png')不支持PHP 5.5的IE11服务,因为在图像流中显示为文本

header('Content-Type: image/png')起作用,就像图像以图像的形式出现

唯一的区别是大写'T'。

tldr; HTTP / 1.1和HTTP / 2头都是不区分大小写的。

根据RFC 7230 (HTTP / 1.1):

每个标题字段包含一个不区分大小写的字段名称,后跟一个冒号(“:”),可选的前导空格,字段值和可选的尾随空格。

https://tools.ietf.org/html/rfc7230#section-3.2

另外, RFC 7540 (HTTP / 2):

就像在HTTP / 1.x中一样,标题字段名称是ASCII字符串
以不区分大小写的方式进行比较的字符。

https://tools.ietf.org/html/rfc7540#section-8.1.2

HTTP的RFC(如上所述)规定头是不区分大小写的,但是你会发现,在某些浏览器(我在看你,IE),大写每个单词往往是最好的:

 Location: http://stackoverflow.com Content-Type: text/plain 

VS

 location: http://stackoverflow.com content-type: text/plain 

这不是“HTTP”标准,而是另一个浏览器怪癖,我们作为开发者,必须考虑。