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?


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.


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

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


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'.


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.


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.


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.


-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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.