在博客文章中,我使用以下PHP代码来设置响应的内容类型:
header('content-type: application/json; charset=utf-8');
我刚刚在那篇文章上收到了一条评论,说content-type
需要大写,即Content-type
。这是正确的吗?对我来说,使用全部小写似乎也可以工作,而且我认为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 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
curl -X put
会从服务器返回400错误,这个错误信息很难理解。花了一些时间才意识到动词是无效的。curl也没有抛出任何警告。而使用 curl -X PUT
则可以成功执行。 - Sushil根据RFC 7230第3.2节的规定:
每个头字段由一个大小写不敏感的字段名称,后跟一个冒号(“:”),可选的前导空格,字段值和可选的尾随空格组成。
引用RFC 7540第8.1.2节的内容:
与HTTP/1.x一样,头字段名称是ASCII字符串,在不区分大小写的情况下进行比较。
...但是:
然而,在HTTP/2中编码之前,头字段名称必须转换为小写。包含大写字母的请求或响应必须被视为格式错误。
header('Content-type: image/png')
在PHP 5.5下无法在IE11中正常显示图像流,因为它被显示为文本。
header('Content-Type: image/png')
可以正常工作,图像将会呈现为图像。
两者唯一的不同是大写字母'T'。
HTTP头字段不区分大小写。实际上,NodeJS Web服务器在将其放入请求对象之前,明确将它们转换为小写字母。
需要注意的是,所有标头都仅以小写形式表示,无论客户端实际上如何发送它们。这简化了解析标头以及其他目的的任务。
官方上说HTTP头大小写不敏感,但通常的做法是将每个单词的首字母大写。
但由于这是普遍的做法,像IE这样的程序会默认HTTP头为首字母大写。
因此,虽然文档中说HTTP头不区分大小写,但糟糕的程序员已经改掉了文档。
Location: http://stackoverflow.com
Content-Type: text/plain
vs
location: http://stackoverflow.com
content-type: text/plain
这不是“HTTP”标准,而只是我们作为开发人员必须考虑的浏览器怪癖之一。