HTTP标头区分大小写吗?


712

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

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

我刚刚对该帖子发表了评论,说content-type需要大写Content-type。它是否正确?似乎对所有小写字母都有效,并且我假设HTTP标头不区分大小写。还是只是因为浏览器不错而起作用?


26
它不区分大小写,但是如果要解决此问题,则应为“ Content-Type”。
mc0e 2015年

10
FWIW,使用application / json发送“字符集”是没有意义的。没有这样的参数。
朱利安·雷施克

5
@JulianReschke-这是错误的,charset是Content-Type标头中的有效参数。参见w3.org/International/articles/http-charset/indexdeveloper.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain

8
@NullUserException-缺点(除了浪费的字节)是继续使人们对字符集参数感到困惑。只需修复这些组件即可。
朱利安·雷施克

10
@JulianReschke是正确的。该IANA应用/ JSON分配表示字符集是没有意义的这种介质类型。它什么也没做。请不要添加它,因为它会导致不必要的混乱。
恢复莫妮卡2331977年

Answers:


934

标头名称不区分大小写。

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

每个标题字段均由名称,后跟冒号(“:”)和字段值组成。字段名称是区分敏感。

更新的RFC 7230 在此部分未列出对RFC 2616的任何更改


96
答案仍然是正确的,RFC 7230指出:“每个标头字段由不区分大小写的字段名称组成,后跟冒号(“:”),可选的前导空白,字段值和可选的尾随空白。
马丁·米勒

6
当使用PHP通过'apache_request_headers()'方法获取头字段的值时,头字段区分大小写。
2015年

7
谁能提供在这方面不符合规范的流行浏览器示例?
David W

7
@Harm这仅是因为PHP中的字符串比较区分大小写。
MrWhite 2016年

7
对于任何人,RFC 7230都在这里明确指出应将字段头视为不区分大小写:tools.ietf.org/html/rfc7230#section-3.2
JZ

238

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

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-method
   extension-method = token

另有评论说这个答案已过时。真的吗?如果是这样,也许您可​​以对其进行更新,以使人们不会感到困惑。
快艇

36

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


19
只是说明一下:字段名称不区分大小写;字段可以区分大小写,具体取决于字段名称。
朱利安·瑞施

7
从HTTP / 2 RFC继续引用:“但是,报头字段名称必须先转换为小写,然后再在HTTP / 2中进行编码。包含大写报头字段名称的请求或响应必须视为格式错误(第8.1.2.6节)”
Borek Bernard

1
我只是注意到“必须转换为小写...”部分。这是为什么?在实践中,CamelCase似乎是首选的大写字母(开发人员工具,流行的代码库),那么为什么HTTP / 2会尝试违背这种趋势?
jimp

7
@jimp-因为标准是关于一致性的-使用驼峰式大小写可能会模棱两可-尤其是缩写,初始化和首字母缩写词。例如-是“ Front-End-Https”还是“ Front-End-HTTPS”-“ WWW-Authenticate”或“ Www-Authenticate”-指定所有小写字母可以通过标准化字段来消除歧义。反过来,这简化了整个头文件的处理。
弗雷泽

16

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

header('Content-Type: image/png') 起作用,因为图像中显示为图像

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


18
然后,显然存在实现问题,因为所有标头字段均应视为不区分大小写。Apache Bench也陷入困境。它不喜欢小写的字段名称。
债券

8

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

重要的是在此处注意,无论客户端实际上如何发送它们,所有标头均仅以小写形式表示。这简化了出于任何目的解析标头的任务。


这是因为node / javascript区分大小写,因此为了简化起见,它们将所有内容标准化为小写,这意味着实际上HTTP头不区分大小写。
Svish

4

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

Location: http://stackoverflow.com

Content-Type: text/plain

location: http://stackoverflow.com

content-type: text/plain

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


3
您能提供任何证据吗?
朱利安·雷施克

3
我的意思是一个具体的测试用例。我确实有一个IE要测试。
朱利安·雷施克

11
为什么它总是最好的呢?
Svish

我将制作一个浏览器,它发送带有随机大写字母的标题只是为了与开发
人员联系

0

正式地,标头不区分大小写,但是,通常的做法是将每个单词的首字母大写。
但是,由于是通常的做法,因此某些程序(例如IE)会假定标头大写。
因此,尽管文档说区分大小写,但糟糕的程序员基本上已经更改了文档。


-4

标头单词不区分大小写,但是像Content-Type这样的右侧,以这种方式编写是一种好习惯,因为它区分大小写。就像我下面的例子

headers = headers.set('Content-Type'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.