在一篇博客文章中,我使用以下PHP来设置响应的内容类型:
header('content-type: application/json; charset=utf-8');
我刚刚收到一篇关于那篇文章的评论,说content-type需要大写,Content-type。这是正确的吗?它似乎对我所有的小写都有效,我假设HTTP头不区分大小写。或者它只是因为浏览器很好才起作用?
content-type
Content-type
标题名称不区分大小写。
从RFC 2616-“超文本传输协议——HTTP/1.1”,第4.2节,“消息头”:
每个头字段由一个名称后跟一个冒号(“:”)和字段值组成。字段名称区分大小写在。
更新的RFC 7230在这一部分没有列出任何从RFC 2616更改。
HTTP标头名称不区分大小写,根据rfc2616:
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-methodextension-method = token
方法标记表示要在上执行的方法的资源请求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-methodextension-method = token
header('Content-type: image/png')不适用于为IE11服务的PHP 5.5,因为在图像流中显示为文本
header('Content-type: image/png')
header('Content-Type: image/png')工作,在图像中显示为图像
header('Content-Type: image/png')
唯一的区别是大写的“T”。
HTTP的RFC(如上所述)规定标头不区分大小写,但是您会发现在某些浏览器(我在看您,IE)中,将每个单词大写往往是最好的:
Location: http://stackoverflow.com Content-Type: text/plain
vs
location: http://stackoverflow.com content-type: text/plain
这不是“HTTP”标准,只是浏览器的另一个怪癖,我们作为开发人员,必须考虑。
tldr; HTTP/1.1和HTTP/2标头不区分大小写。
根据rfc7230(HTTP/1.1):
每个头字段由一个不区分大小写的字段名称组成后跟冒号(":"),可选的前导空格,字段值和可选的尾随空格。
https://www.rfc-editor.org/rfc/rfc7230#section-3.2
rfc7540(HTTP/2):
就像在HTTP/1. x中一样,头字段名称是ASCII的字符串以不区分大小写的方式比较的字符。
https://www.rfc-editor.org/rfc/rfc7540#section-8.1.2
它们不区分大小写。事实上,在使它们在请求对象中可用之前,NodeJS Web服务器明确地将它们为小写。
这里需要注意的是,所有标题都表示为仅限小写,无论客户端实际如何发送它们。这简化了为任何目的解析标头的任务。
正式地,标题是不区分大小写的,然而,通常的做法是将每个单词的第一个字母大写。但是,因为这是常见的做法,某些程序(如IE)假设标头是大写的。所以当文档说不区分大小写时,糟糕的程序员基本上改变了文档。