Os cabeçalhos HTTP diferenciam maiúsculas de minúsculas?

713

Em uma postagem no blog, 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 nesse post dizendo que content-typeprecisa ser capitalizado Content-type,. Isso está correto? Parece funcionar para mim com todas as letras minúsculas e presumi que os cabeçalhos HTTP não diferenciassem maiúsculas de minúsculas. Ou funciona apenas porque os navegadores são bons?

Svish
fonte
26
Não diferencia maiúsculas de minúsculas, mas se você for consertar o caso, ele deve ser 'Tipo de Conteúdo'.
Mc0e
10
FWIW, enviar "charset" com application / json é inútil. Não existe esse parâmetro.
Julian Reschke
5
@JulianReschke - Isso é falso, charset é um parâmetro válido no cabeçalho Content-Type. Veja w3.org/International/articles/http-charset/index e developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain
8
@NullUserException - a desvantagem (além dos bytes desperdiçados) é continuar confundindo as pessoas sobre o parâmetro charset. Basta consertar esses componentes.
Julian Reschke
10
@JulianReschke está correto. A atribuição de aplicativo / json da IANA diz que charset não faz sentido para esse tipo de mídia. isso não faz nada. Por favor, não adicione, porque é o ruído que leva à confusão desnecessária.
Reintegrar Monica 2331977

Respostas:

934

Os nomes dos cabeçalhos não diferenciam maiúsculas de minúsculas.

Do RFC 2616 - "Protocolo de transferência de hipertexto - HTTP / 1.1" , Seção 4.2, "Cabeçalhos de mensagens" :

Cada campo de cabeçalho consiste em um nome seguido por dois pontos (":") e o valor do campo. Os nomes dos campos diferenciam maiúsculas de minúsculas.

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

Ignacio Vazquez-Abrams
fonte
96
A resposta ainda é verdadeira, a RFC 7230 afirma: "Cada campo de cabeçalho consiste em um nome de campo que não diferencia maiúsculas de minúsculas, seguido por dois pontos (": "), espaço em branco à esquerda opcional, o valor do campo e espaço em branco à direita opcional."
Martin Müller
6
Os campos de cabeçalho diferenciam maiúsculas de minúsculas ao usar o PHP para obter o valor de um campo de cabeçalho usando o método 'apache_request_headers ()'.
de
7
Alguém pode fornecer exemplos de navegadores populares que não atendem às especificações a esse respeito?
David W
7
@Harm Isso é apenas porque a comparação de strings no PHP faz distinção entre maiúsculas e minúsculas.
MrWhite 22/02
7
Para quem procura, aqui é onde RFC 7230 afirma explicitamente que os cabeçalhos de campo deve ser tratado como caso insensível: tools.ietf.org/html/rfc7230#section-3.2
JZ
238

Os nomes de cabeçalho HTTP não diferenciam maiúsculas de minúsculas, de acordo com a RFC 2616 :

4.2:

Cada campo de cabeçalho consiste em um nome seguido por dois pontos (":") e o valor do campo. Os nomes dos campos não diferenciam maiúsculas de minúsculas.

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

Se você confia nos principais navegadores para cumprir isso, está tudo pronto.


BTW, ao contrário da maioria de HTTP, métodos (verbos) são maiúsculas de minúsculas:

5.1.1 Método

O token do método indica o método a ser executado no
recurso identificado pelo Request-URI. O método diferencia maiúsculas de 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
Raças de leveza em órbita
fonte
Outro comentário disse que esta resposta está obsoleta. Isso é verdade? Nesse caso, talvez você possa atualizá-lo para que as pessoas não fiquem confusas.
speedplane 7/03/16
36

tldr; os cabeçalhos HTTP / 1.1 e HTTP / 2 não diferenciam maiúsculas de minúsculas.

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

Cada campo de cabeçalho consiste em um nome de campo que não diferencia maiúsculas de minúsculas, seguido por dois pontos (":"), espaço em branco à esquerda opcional, o valor do campo e espaço em branco à direita 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 cabeçalho são cadeias de
caracteres ASCII que são comparadas de maneira que não diferenciam maiúsculas de minúsculas.

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

Afshin Mehrabani
fonte
19
apenas esclarecendo: os nomes dos campos não diferenciam maiúsculas de minúsculas; os valores do campo podem fazer distinção entre maiúsculas e minúsculas, dependendo do nome do campo.
Julian Reschke
7
Citação continuada do HTTP / 2 RFC: "No entanto, os nomes dos campos de cabeçalho DEVEM ser convertidos em minúsculas antes de sua codificação em HTTP / 2. Uma solicitação ou resposta contendo nomes de campos de cabeçalho de maiúsculas DEVE ser tratada como malformada (Seção 8.1.2.6)"
Borek Bernard
2
Acabei de notar que a parte "DEVE ser convertida para minúscula ..." também. Por que é que? O CamelCase parece ser o invólucro preferido na prática (ferramentas de desenvolvedor, bibliotecas de códigos populares), então por que o HTTP / 2 tentaria ir contra essa tendência?
jimp
7
@jimp - porque os padrões são consistentes - o uso de camel-case pode ser ambíguo - especialmente com abreviações, inicializações e acrônimos. Por exemplo - seria "Front-End-Https" ou "Front-End-HTTPS" - "WWW-Authenticate" ou "Www-Authenticate" - especificar todas as letras minúsculas remove a ambiguidade padronizando o campo. Isso, por sua vez, simplifica o manuseio dos cabeçalhos o tempo todo.
Fraser
16

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

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

A única diferença é o capital 'T'.

Rudiger W.
fonte
18
Obviamente, há um problema com a implementação porque todos os campos de cabeçalho devem ler como não diferenciam maiúsculas de minúsculas. O Apache Bench também está bagunçado. Não gosta de nomes de campos em minúsculas.
ligao
8

Eles não diferenciam maiúsculas de minúsculas. De fato, o servidor da Web NodeJS os converte explicitamente em minúsculas, antes de disponibilizá-los no objeto de solicitação.

É importante observar aqui que todos os cabeçalhos são representados apenas em minúsculas, independentemente de como o cliente realmente os enviou. Isso simplifica a tarefa de analisar cabeçalhos para qualquer finalidade.

jayarjo
fonte
Isso ocorre porque o nó / javascript faz distinção entre maiúsculas e minúsculas e, para simplificar as coisas, eles normalizam tudo para minúsculas, o que significa que os cabeçalhos HTTP em vigor não diferenciam maiúsculas de minúsculas.
#
4

O RFC para HTTP (como citado acima) determina que os cabeçalhos não diferenciam maiúsculas de minúsculas; no entanto, você encontrará que em determinados navegadores (estou olhando para você, IE), colocar em maiúscula 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

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

Robert Lerner
fonte
3
Você poderia fornecer alguma evidência disso?
Julian Reschke
3
Eu quis dizer um caso de teste concreto; Eu tenho um IE para testar.
Julian Reschke
11
Por que exatamente isso costuma ser melhor?
Svish
Vou criar um navegador que envie cabeçalhos com
letras
0

oficialmente, os cabeçalhos não diferenciam maiúsculas de minúsculas; no entanto, é prática comum colocar em maiúscula a primeira letra de cada palavra.
mas, como é uma prática comum, certos programas como o IE assumem que os cabeçalhos estão em maiúsculas.
portanto, enquanto os documentos dizem que não diferenciam maiúsculas de minúsculas, programadores ruins basicamente mudaram os documentos.

GideonMax
fonte
-4

a palavra Cabeçalhos não faz distinção entre maiúsculas e minúsculas, mas, à direita, como o Tipo de Conteúdo, é uma boa prática escrevê-la dessa maneira, porque é sensível a maiúsculas. como meu exemplo abaixo

headers = headers.set('Content-Type'
PPK
fonte