HTTP标头区分大小写吗?

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

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

我刚刚收到一篇关于那篇文章的评论,说content-type需要大写,Content-type。这是正确的吗?它似乎对我所有的小写都有效,我假设HTTP头不区分大小写。或者它只是因为浏览器很好才起作用?

320915 次浏览

标题名称不区分大小写。

RFC 2616-“超文本传输协议——HTTP/1.1”第4.2节,“消息头”

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

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

HTTP标头名称不区分大小写,根据rfc2616

4.2:

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

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

如果您相信主要浏览器会遵守这一点,那么您就万事俱备了。


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

5.1.1方法

方法标记表示要在
上执行的方法的资源请求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-methodextension-method = token

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

header('Content-Type: image/png')工作,在图像中显示为图像

唯一的区别是大写的“T”。

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

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

vs

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

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

tldr; HTTP/1.1和HTTP/2标头不区分大小写。

根据rfc7230(HTTP/1.1):

每个头字段由一个不区分大小写的字段名称组成后跟冒号(":"),可选的前导空格,字段值和可选的尾随空格。

https://www.rfc-editor.org/rfc/rfc7230#section-3.2

rfc7540(HTTP/2):

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

https://www.rfc-editor.org/rfc/rfc7540#section-8.1.2

它们不区分大小写。事实上,在使它们在请求对象中可用之前,NodeJS Web服务器明确地将它们为小写。

这里需要注意的是,所有标题都表示为仅限小写,无论客户端实际如何发送它们。这简化了为任何目的解析标头的任务。

正式地,标题是不区分大小写的,然而,通常的做法是将每个单词的第一个字母大写。
但是,因为这是常见的做法,某些程序(如IE)假设标头是大写的。所以当文档说不区分大小写时,糟糕的程序员基本上改变了文档。