Os headers HTTP são sensíveis a maiúsculas e minúsculas?

Em um post do blog eu uso o seguinte PHP para definir o tipo de conteúdo de uma resposta:

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

Acabei de receber um comentário sobre esse post dizendo que o content-type precisa ser capitalizado, Content-type . Isso está correto? Parece funcionar para mim com todos os minúsculos, e eu assumi que os headers HTTP eram insensíveis a maiúsculas e minúsculas. Ou isso simplesmente funciona porque os navegadores são bons?

Nomes de header não diferenciam maiúsculas de minúsculas.

De RFC 2616 – “Protocolo de transferência de hipertexto – HTTP / 1.1” , seção 4.2, “Cabeçalhos de mensagem” :

Cada campo de header consiste em um nome seguido por dois pontos (“:”) e o valor do campo. Nomes de campos são insensíveis a maiúsculas e minúsculas.

A atualização RFC 7230 não lista nenhuma alteração do RFC 2616 nesta parte.

Os nomes dos headers HTTP não diferenciam maiúsculas de minúsculas, de acordo com a RFC 2616 :

4.2:

Cada campo de header consiste em um nome seguido por dois pontos (“:”) e o valor do campo. Nomes de campos são insensíveis a maiúsculas e minúsculas.

(Os valores de campo podem ou não fazer distinção entre maiúsculas e minúsculas).

Se você confia que os principais navegadores cumpram isso, está tudo pronto.


BTW, diferentemente da maioria dos HTTP, os methods (verbos) diferenciam maiúsculas de minúsculas:

5.1.1 Método

O token Method indica o método a ser executado no
recurso identificado pelo Request-URI. O método é sensível a maiúsculas e minúsculas.

  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 

tldr; Os headers HTTP / 1.1 e HTTP / 2 são insensíveis a maiúsculas e minúsculas.

De acordo com a RFC 7230 (HTTP / 1.1):

Cada campo de header consiste em um nome de campo sem distinção entre maiúsculas e minúsculas seguido por dois-pontos (“:”), espaço em branco inicial opcional, o valor do campo e espaço em branco final opcional.

https://tools.ietf.org/html/rfc7230#section-3.2

Além disso, o RFC 7540 (HTTP / 2):

Assim como no HTTP / 1.x, os nomes dos campos de header são strings de ASCII
caracteres que são comparados de uma maneira que não diferencia maiúsculas de minúsculas.

https://tools.ietf.org/html/rfc7540#section-8.1.2

header('Content-type: image/png') não funcionou com o PHP 5.5 servindo IE11, como no stream de imagem foi mostrado como texto

header('Content-Type: image/png') funcionou, como na imagem apareceu como uma imagem

A única diferença é a capital ‘T’.

O RFC para HTTP (como citado acima) dita que os headers são insensíveis a maiúsculas e minúsculas, no entanto, você descobrirá que com certos navegadores (estou olhando para você, IE) que capitalizar cada uma das palavras tende a ser melhor:

 Location: http://stackoverflow.com Content-Type: text/plain 

vs

 location: http://stackoverflow.com content-type: text/plain 

Este não é o padrão “HTTP”, mas apenas mais uma das peculiaridades do navegador, como desenvolvedores, temos que pensar.