HTTP标头是否区分大小写?
在博客文章中,我使用以下PHP来设置响应的内容类型:
header('content-type: application/json; charset=utf-8');
我刚刚对该帖子发表评论说, content-type
需要大写, Content-type
。 它是否正确? 它似乎对我来说都是小写的,我认为HTTP头是不区分大小写的。 还是只是因为浏览器很好?
从RFC 2616 – “超文本传输协议 – HTTP / 1.1” , 第4.2节“消息头” :
每个标题字段由一个名字后跟一个冒号(“:”)和字段值组成。 字段名称不区分大小写。
RFC 7230的更新没有列出这部分RFC 2616的任何更改 。
根据RFC 2616 ,HTTP标头名称不区分大小写。
4.2:
每个标题字段由一个名字后跟一个冒号(“:”)和字段值组成。 字段名称不区分大小写。
(字段值可能区分大小写,也可能不区分大小写)
如果你信任主要的浏览器遵守这一点,你就全部设置好了。
顺便说一句,不像大多数的HTTP,方法(动词) 是区分大小写的:
5.1.1方法
方法标记指示要在该方法上执行的方法
由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
header('Content-type: image/png')
不支持PHP 5.5的IE11服务,因为在图像流中显示为文本
header('Content-Type: image/png')
起作用,就像图像以图像的形式出现
唯一的区别是大写'T'。
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字符串
以不区分大小写的方式进行比较的字符。
HTTP的RFC(如上所述)规定头是不区分大小写的,但是你会发现,在某些浏览器(我在看你,IE),大写每个单词往往是最好的:
Location: http://stackoverflow.com Content-Type: text/plain
VS
location: http://stackoverflow.com content-type: text/plain
这不是“HTTP”标准,而是另一个浏览器怪癖,我们作为开发者,必须考虑。