在一篇博文中,我使用以下 PHP 设置响应的内容类型:
header('content-type: application/json; charset=utf-8');
我刚刚收到对该帖子的评论,说 content-type
需要大写,Content-type
。这个对吗?它似乎适用于所有小写字母,并且我认为 HTTP 标头不区分大小写。或者它只是因为浏览器很好而起作用?
标题名称不区分大小写。
从 RFC 2616 - "Hypertext Transfer Protocol -- HTTP/1.1"、Section 4.2, "Message Headers":
每个标头字段由一个名称后跟一个冒号(“:”)和字段值组成。字段名称不区分大小写。
更新的 RFC 7230 在这部分没有列出任何 changes from RFC 2616。
根据 RFC 2616,HTTP 标头名称不区分大小写:
4.2:
每个标头字段由一个名称后跟一个冒号(“:”)和字段值组成。字段名称不区分大小写。
(字段值可能区分大小写,也可能不区分大小写。)
如果您相信主流浏览器会遵守这一点,那么您就大功告成了。
顺便说一句,与大多数 HTTP 不同,方法(动词)区分大小写:
5.1.1 方法
Method 标记指示要对由 Request-URI 标识的资源执行的方法。该方法区分大小写。方法=“选项”;第 9.2 节 | “得到” ;第 9.3 节 | “头” ;第 9.4 节 | “邮政” ;第 9.5 节 | “放” ;第 9.6 节 | “删除” ;第 9.7 节 | “痕迹” ;第 9.8 节 | “连接” ;第 9.9 节 |扩展方法扩展方法=令牌
curl -X put
小写动词将从服务器返回 400 bad request cryptic error。过了一段时间才意识到这个动词是无效的。 curl 也没有发出任何警告。 curl -X PUT
通过。
tldr; HTTP/1.1 和 HTTP/2 标头都不区分大小写。
根据 RFC 7230 (HTTP/1.1):
每个标头字段由不区分大小写的字段名称后跟冒号 (":")、可选的前导空格、字段值和可选的尾随空格组成。
https://www.rfc-editor.org/rfc/rfc7230#section-3.2
此外,RFC 7540 (HTTP/2):
就像在 HTTP/1.x 中一样,标头字段名称是 ASCII 字符串,它们以不区分大小写的方式进行比较。
https://www.rfc-editor.org/rfc/rfc7540#section-8.1.2
header('Content-type: image/png')
不适用于提供 IE11 的 PHP 5.5,因为图像流显示为文本
header('Content-Type: image/png')
工作,因为在图像中显示为图像
唯一的区别是大写的“T”。
它们不区分大小写。实际上 NodeJS 网络服务器 explicitly converts them 是小写的,然后才使它们在请求对象中可用。
重要的是要注意,所有标头都仅以小写形式表示,而不管客户端如何实际发送它们。这简化了为任何目的解析标头的任务。
正式地,标题不区分大小写,但是,通常将每个单词的第一个字母大写。但是,因为这是常见的做法,某些程序(如 IE)假定标题是大写的。因此,虽然文档说不区分大小写,但糟糕的程序员基本上已经更改了文档。
HTTP 的 RFC(如上所述)规定标头不区分大小写,但是您会发现对于某些浏览器(我在看您,IE),将每个单词大写往往是最好的:
Location: http://stackoverflow.com
Content-Type: text/plain
对比
location: http://stackoverflow.com
content-type: text/plain
这不是“HTTP”标准,而只是浏览器的另一种怪癖,我们作为开发人员必须考虑。
Headers 字不区分大小写,但在右侧,就像 Content-Type 一样,这样写是个好习惯,因为它区分大小写。就像我下面的例子
headers = headers.set('Content-Type'