HTTP标头区分大小写吗?

Svi*_*ish 642 http http-headers

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

header('content-type: application/json; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

我刚刚对该帖子发表评论说content-type需要大写,Content-type.它是否正确?它似乎适用于所有小写的我,我假设HTTP标题不区分大小写.或者它只是工作,因为浏览器很好?

Ign*_*ams 853

标题名称不区分大小写.

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

每个标题字段由一个名称后跟一个冒号(":")和字段值组成.字段名称区分敏感.

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

  • 答案仍然是正确的,RFC 7230声明:"每个头字段包含一个不区分大小写的字段名称后跟一个冒号(":"),可选的前导空格,字段值和可选的尾随空格." (90认同)
  • @Harm这只是因为PHP中的字符串比较区分大小写. (7认同)
  • 对于任何人来说,这里是RFC 7230明确声明字段标题应被视为不区分大小写的地方:https://tools.ietf.org/html/rfc7230#section-3.2 (7认同)
  • 任何人都可以提供不符合这方面规范的流行浏览器示例吗? (6认同)
  • 使用PHP以使用方法'apache_request_headers()'获取标头字段的值时,标头字段区分大小写. (4认同)
  • 标题字段值呢? (2认同)
  • @JoeCodeFrog:标题字段值是应用程序定义的; 您需要查阅正在使用的特定应用程序的文档. (2认同)

Lig*_*ica 224

根据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
Run Code Online (Sandbox Code Playgroud)

  • +1提及HTTP动词的情况 (60认同)
  • 另一条评论说这个答案已经过时了。真的吗?如果是这样,也许您可​​以更新它,这样人们就不会感到困惑。 (2认同)

Afs*_*ani 31

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

  • 只是澄清:字段*名称*不区分大小写; field*values*可以区分大小写,具体取决于字段名称. (16认同)
  • @jimp - 因为标准是关于一致性的 - 使用camel-case可能含糊不清 - 尤其是缩写,初始化和首字母缩略词.例如 - 它是"Front-End-Https"还是"Front-End-HTTPS" - "WWW-Authenticate"或"Www-Authenticate" - 指定所有小写通过标准化字段来消除歧义.这反过来简化了全面处理标题. (7认同)
  • 从HTTP / 2 RFC继续引用:“但是,报头字段名称必须先转换为小写,然后再在HTTP / 2中进行编码。包含大写头字段名称的请求或响应必须被视为格式错误(第8.1.2.6节)” (4认同)
  • 我刚刚注意到“必须转换为小写...”部分。这是为什么?CamelCase 在实践中似乎是首选的大小写(开发者工具、流行的代码库),那么为什么 HTTP/2 会试图违背这一趋势呢? (3认同)
  • @jimp它可能与HPACK有关,HPACK是HTTP2使用的标头压缩算法。如果全部都是小写的话肯定会更容易。它还具有一个小型静态字典:https://tools.ietf.org/html/rfc7541#appendix-A (3认同)

Rud*_* W. 14

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

header('Content-Type: image/png') 工作,如图像中出现的图像

唯一的区别是资本'T'.

  • 然后显然存在实现问题,因为所有头字段都应该读作不区分大小写.Apache Bench也搞砸了.它不喜欢小写字段名称. (15认同)

Gid*_*Max 12

官方规定,标题不区分大小写,但是,通常的做法是将每个单词的第一个字母大写。
但是,由于这是常见的做法,某些程序(例如 IE)假定标头是大写的。
因此,虽然文档说不区分大小写,但糟糕的程序员基本上已经更改了文档。


jay*_*rjo 10

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

重要的是要注意,所有标头都仅以小写形式表示,而不管客户端实际如何发送它们。这简化了出于任何目的解析标头的任务。


小智 5

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

Location: http://stackoverflow.com

Content-Type: text/plain
Run Code Online (Sandbox Code Playgroud)

对比

location: http://stackoverflow.com

content-type: text/plain
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么它往往是最好的? (13认同)
  • 你能提供任何证据吗? (4认同)
  • 我的意思是一个具体的测试用例;我确实有一个 IE 来测试。 (3认同)
  • 我将制作一个发送随机大写标头的浏览器,只是为了与开发人员搞砸 (3认同)