HTTP头是否区分大小写?

HTTP头是否区分大小写?,http,http-headers,Http,Http Headers,在一篇博客文章中,我使用以下PHP设置响应的内容类型: header('content-type: application/json; charset=utf-8'); 我刚刚在那篇帖子上得到一条评论说,内容类型需要大写,内容类型。这是正确的吗?它似乎适用于所有小写,我假设HTTP头不区分大小写。还是仅仅因为浏览器很好才起作用?标题名称不区分大小写 Method = "OPTIONS" ; Section 9.2

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

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

我刚刚在那篇帖子上得到一条评论说,
内容类型
需要大写,
内容类型
。这是正确的吗?它似乎适用于所有小写,我假设HTTP头不区分大小写。还是仅仅因为浏览器很好才起作用?

标题名称不区分大小写

   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
从,:

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

   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

更新的RFC 7230在此部分未列出任何标题。

根据以下说明,HTTP标头名称不区分大小写:

4.2:

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

   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
(字段值可能区分大小写,也可能不区分大小写。)

如果你相信主流浏览器会遵守这一点,你就万事大吉了


顺便说一句,与大多数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
header('Content-type:image/png')
不适用于服务于IE11的PHP5.5,因为图像流显示为文本

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

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

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

Location: http://stackoverflow.com

Content-Type: text/plain
vs


这不是“HTTP”标准,但只是我们作为开发人员必须考虑的另一个浏览器怪癖HTTP/1.1和HTTP/2头都不区分大小写

根据RFC 7230(HTTP/1.1):

每个标头字段由一个不区分大小写的字段名组成 后跟冒号(“:”),可选的前导空格,字段 值,以及可选的尾随空格

另外,RFC 7540(HTTP/2):

正如在HTTP/1.x中一样,头字段名是ASCII字符串
以不区分大小写的方式进行比较的字符


它们不区分大小写。事实上,在请求对象中提供它们之前,将web服务器NodeJS改为小写

这里需要注意的一点是,所有标题都表示为 仅小写,不管客户机实际如何发送。这 简化了出于任何目的解析标头的任务


根据官方规定,页眉不区分大小写,但通常的做法是将每个单词的第一个字母大写。
但是,由于这是一种常见的做法,某些程序(如IE)假定头是大写的。

因此,虽然文档说文档不区分大小写,但糟糕的程序员基本上改变了文档。

标题词不区分大小写,但在右边,与内容类型一样,以这种方式编写是一种很好的做法,因为它区分大小写。就像我下面的例子

headers = headers.set('Content-Type'

我使用的代码如下:

reqObj['headers'] = new Headers({
    CSRF: ABCD-DEFG..,
});


我可以看到它被转换成小写('csrf')。将重新访问,并更新进一步的调查结果。然而,由于它是由构造函数完成的,我认为它应该可以工作。因此,标题似乎也不区分大小写。

答案仍然正确,RFC 7230声明:“每个标题字段由一个不区分大小写的字段名,后跟冒号(“:”)、可选的前导空格、字段值和可选的尾随空格组成。”当使用PHP通过“apache_request_headers()”方法获取标题字段的值时,标题字段区分大小写。有人能提供不符合这方面规范的流行浏览器的示例吗?@Harm这只是因为PHP中的字符串比较区分大小写。对于任何人,在这里,RFC 7230明确指出字段头应该被视为不区分大小写:它不区分大小写,但是如果要修复大小写,它应该是“Content Type”。FWIW,用application/json发送“charset”是没有意义的。没有这样的参数。@JulianReschke-如果为false,则字符集是内容类型标头中的有效参数。请参阅和@NullUserException-缺点(除了浪费的字节外)是继续混淆人们对字符集参数的认识。只需修复这些组件即可。@JulianReschke是正确的。字符集对于这种媒体类型来说是没有意义的。它没有任何作用。请不要添加它,因为它的噪音会导致不必要的混乱。然后,实现显然存在问题,因为所有头字段都应该是不区分大小写的。阿帕奇板凳也一团糟。它不喜欢小写字段名。另一条评论说这个答案已经过时了。这是真的吗?如果是这样,也许您可以更新它,这样人们就不会感到困惑。使用
curl-xput
小写动词将从服务器返回400个错误请求隐式错误。过了一段时间才意识到那个动词是无效的。curl也没有发出任何警告<代码>curl-X PUT通过了。你能提供任何证据吗?我指的是一个具体的测试用例;我确实有一个IE要测试。为什么它会是最好的呢?我会制作一个浏览器,发送带有随机大写字母的标题,只是为了搞乱devs只是澄清一下:字段名不区分大小写;字段值可以区分大小写,具体取决于字段名。继续引用HTTP/2 RFC:“但是,在HTTP/2中编码之前,标题字段名必须转换为小写。包含大写标题字段名的请求或响应必须视为格式错误(第8.1.2.6节)”我刚刚注意到“必须转换成小写…”部分。为什么呢?CamelCase似乎是首选
   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