HTTP头部(headers)是否区分大小写?

983

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

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

我刚刚在那篇文章上收到了一条评论,说content-type需要大写,即Content-type。这是正确的吗?对我来说,使用全部小写似乎也可以工作,而且我认为HTTP头部不区分大小写。或者仅仅因为浏览器很好心才能起作用吗?


54
不区分大小写,但如果你打算修正大小写,应该改为“Content-Type”。 - mc0e
21
发送带有"charset"的application/json是毫无意义的,因为没有这样的参数。 - Julian Reschke
14
@NullUserException 的缺点(除了浪费字节之外)是会继续使人们对字符集参数感到困惑。相反,应该先解决这些组件的问题,而不是简单地废弃它们。 - Julian Reschke
18
@JulianReschke 是正确的。IANA application/json 分配 表明字符集对于这种媒体类型没有意义,不会起到任何作用。请不要添加它,因为这只是让人感到困惑且不必要的干扰。 - jr.
6
我猜可能不行,Tyeth。JSON被规定仅以UTF-8、UTF-16或UTF-32编码;若使用其他编码,则不属于JSON格式。它们是编码方式,而非字符集(尽管“字符集”一词在这个区别上有些模糊)——它们都是Unicode字符集的编码方式。规范还强制指定从内容自行确定正确编码的算法,因此唯一需要包含的原因是为了解决软件读取JSON和内容类型头错误的Bug问题。 - Semicolon
显示剩余2条评论
7个回答

1270

139
答案仍然正确,RFC 7230规定:“每个标头字段由不区分大小写的字段名称后跟冒号(“:”),可选的前导空格,字段值和可选的尾随空格组成。” - Martin Müller
9
在使用PHP中的方法“apache_request_headers()”获取头字段值时,头字段是区分大小写的。 - Harm
8
有哪些流行的浏览器在这方面没有遵循规范?请提供示例。 - David W
9
那只是因为 PHP 中的字符串比较区分大小写。 - MrWhite
9
任何寻找的人,这里是 RFC 7230 明确规定字段头应该被视为大小写不敏感的位置: https://tools.ietf.org/html/rfc7230#section-3.2 - J Z
显示剩余5条评论

278

根据RFC 2616,HTTP头字段名不区分大小写:

4.2:

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

(字段值可能区分大小写或不区分大小写)

如果您相信主流浏览器会遵守这一点,那么您就可以放心使用。


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

5.1.1 Method

方法令牌指示要在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

2
另一条评论说这个答案已经过时了。这是真的吗?如果是,也许你可以更新一下,这样人们就不会感到困惑了。 - speedplane
1
使用小写的动词 curl -X put 会从服务器返回400错误,这个错误信息很难理解。花了一些时间才意识到动词是无效的。curl也没有抛出任何警告。而使用 curl -X PUT 则可以成功执行。 - Sushil

78
HTTP/1.1和HTTP/2的头部信息名称不区分大小写,但是HTTP/2强制使用小写字母。

HTTP/1.1

根据RFC 7230第3.2节的规定:

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

HTTP/2.0

引用RFC 7540第8.1.2节的内容:

与HTTP/1.x一样,头字段名称是ASCII字符串,在不区分大小写的情况下进行比较。

...但是:

然而,在HTTP/2中编码之前,头字段名称必须转换为小写。包含大写字母的请求或响应必须被视为格式错误。


28
澄清一下:字段的名称不区分大小写;而字段的则取决于字段名称,可能区分大小写。 - Julian Reschke
23
继续引用HTTP/2 RFC中的内容:“然而,在HTTP/2中编码之前,头部字段名必须转换为小写。包含大写头部字段名的请求或响应必须被视为格式错误(第8.1.2.6节)。" - Borek Bernard
3
我注意到了“必须转换为小写”的部分,为什么会这样?在实践中,CamelCase似乎是首选的大小写方式(开发工具、流行代码库),那么为什么HTTP/2要试图反对这种趋势呢? - jimp
15
@jimp - 因为标准是关于一致性的,使用驼峰命名法可能会存在歧义,尤其是在缩写、缩写词和首字母缩写中。例如:是“Front-End-Https”还是“Front-End-HTTPS”?是“WWW-Authenticate”还是“Www-Authenticate”?规定全部小写可以消除歧义并规范化该字段,从而简化处理头部信息的过程。 - Fraser
3
@jimp 可能与HPACK有关,这是与HTTP2一起使用的头部压缩算法。如果所有字母都小写,则肯定更容易。此外,它还有一个小的静态词典:https://tools.ietf.org/html/rfc7541#appendix-A - YoungFrog
谢谢@BorekBernard,我根据您的评论扩展了答案。 - Greg Dubicki

20

header('Content-type: image/png')在PHP 5.5下无法在IE11中正常显示图像流,因为它被显示为文本。

header('Content-Type: image/png')可以正常工作,图像将会呈现为图像。

两者唯一的不同是大写字母'T'。


27
实现方面显然存在问题,因为所有报头字段都应该不区分大小写。Apache Bench 也出了问题,它不喜欢小写的字段名。 - bond

14

HTTP头字段不区分大小写。实际上,NodeJS Web服务器在将其放入请求对象之前,明确将它们转换为小写字母

需要注意的是,所有标头都仅以小写形式表示,无论客户端实际上如何发送它们。这简化了解析标头以及其他目的的任务。


这是因为Node/JavaScript是区分大小写的,所以为了简化事情,它们将所有内容规范化为小写,这意味着HTTP头实际上是不区分大小写的。 - Svish
根据@Borek在此答案上的评论,这表明HTTP/2的标准是:https://dev59.com/HG435IYBdhLWcg3wtScV#41169947 - NeilG

11

官方上说HTTP头大小写不敏感,但通常的做法是将每个单词的首字母大写。
但由于这是普遍的做法,像IE这样的程序会默认HTTP头为首字母大写。
因此,虽然文档中说HTTP头不区分大小写,但糟糕的程序员已经改掉了文档。


@Borek在这个答案上的评论指出了趋势向必须使用小写字母的RFCs。https://dev59.com/HG435IYBdhLWcg3wtScV#41169947 - NeilG
那个RFC确实有这样的说法,但是浏览器的兼容性又有另一种说法,而其中一个更为重要。 - undefined
这是一场战争,@GideonMax,是社区与专有之间的战争。如果社区更重要,那么RFC更重要;如果私人利润和私人控制更重要,那么让我们确保支持那些违背RFC的浏览器。 - undefined
我有一个名为IETester的工具,它可以运行IE 6,并且不区分大小写的标头正常工作。我测试了位置、最后修改和缓存控制标头,它们似乎在给定的混合大小写时也能正常工作。我甚至使用telnet检查了原始的HTTP输出,并确认Apache没有将大小写更改为标题大小写。 - undefined

7
HTTP的RFC(如上所述)规定标头不区分大小写,但您会发现,在某些浏览器中(我在看你,IE),将每个单词大写 tend to be best。
Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

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


4
你能提供任何证据吗? - Julian Reschke
3
我理解您需要一个具体的测试案例;我有一个IE可用于测试。 - Julian Reschke
20
为什么往往会是最好的? - Svish
3
我将制作一个浏览器,发送带有随机大写的标题,只是为了捣乱开发人员。 - GideonMax
除非使用HTTP/2,根据@Borek在此答案中的评论,现在不再允许在标头名称中使用大写字母:https://dev59.com/HG435IYBdhLWcg3wtScV#41169947 - NeilG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接