¿Los encabezados HTTP distinguen entre mayúsculas y minúsculas?

714

En una publicación de blog, uso el siguiente PHP para configurar el tipo de contenido de una respuesta:

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

Acabo de recibir un comentario en ese post diciendo que content-typelas necesidades a ser capitalizadas, Content-type. ¿Es esto correcto? Parece funcionar para mí con todas las minúsculas, y supuse que los encabezados HTTP no distinguen entre mayúsculas y minúsculas. ¿O simplemente funciona porque los navegadores son buenos?

Svish
fuente
26
No distingue entre mayúsculas y minúsculas, pero si va a solucionar el caso, debería ser 'Content-Type'.
mc0e
10
FWIW, enviar "charset" con application / json no tiene sentido. No hay tal parámetro.
Julian Reschke
55
@JulianReschke: eso es falso, charset es un parámetro válido dentro del encabezado Content-Type. Ver w3.org/International/articles/http-charset/index y developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain
8
@NullUserException: la desventaja (aparte de los bytes desperdiciados) es seguir confundiendo a las personas sobre el parámetro charset. Simplemente arregle esos componentes.
Julian Reschke
10
@JulianReschke es correcto. La aplicación IANA / asignación json dice que charset no tiene sentido para este tipo de medios. No hace nada. Por favor, no lo agregue, porque es el ruido lo que genera confusión innecesaria.
Reinstale a Monica 2331977 el

Respuestas:

935

Los nombres de encabezado no distinguen entre mayúsculas y minúsculas.

De RFC 2616 - "Protocolo de transferencia de hipertexto - HTTP / 1.1" , Sección 4.2, "Encabezados de mensajes" :

Cada campo de encabezado consta de un nombre seguido de dos puntos (":") y el valor del campo. Los nombres de campo son sensibles a mayúsculas y minúsculas.

La actualización de RFC 7230 no enumera ningún cambio de RFC 2616 en esta parte.

Ignacio Vazquez-Abrams
fuente
96
La respuesta sigue siendo cierta, RFC 7230 establece: "Cada campo de encabezado consta de un nombre de campo que no distingue entre mayúsculas y minúsculas seguido de dos puntos (": "), espacios en blanco iniciales opcionales, el valor del campo y espacios en blanco finales opcionales".
Martin Müller
66
Los campos de encabezado distinguen entre mayúsculas y minúsculas cuando se usa PHP para obtener el valor de un campo de encabezado usando el método 'apache_request_headers ()'.
Daño
77
¿Alguien puede proporcionar ejemplos de navegadores populares que no cumplan con las especificaciones a este respecto?
David W
77
@Harm Eso es solo porque la comparación de cadenas en PHP distingue entre mayúsculas y minúsculas.
MrWhite
77
Para cualquiera que busque, aquí es donde RFC 7230 establece explícitamente que los encabezados de campo deben tratarse como insensibles a mayúsculas y minúsculas: tools.ietf.org/html/rfc7230#section-3.2
JZ
238

Los nombres de encabezado HTTP no distinguen entre mayúsculas y minúsculas, de acuerdo con RFC 2616 :

4.2:

Cada campo de encabezado consta de un nombre seguido de dos puntos (":") y el valor del campo. Los nombres de campo no distinguen entre mayúsculas y minúsculas.

(Los valores de campo pueden o no ser sensibles a mayúsculas y minúsculas).

Si confía en que los principales navegadores cumplirán con esto, está listo.


Por cierto, a diferencia de la mayoría de HTTP, los métodos (verbos) distinguen entre mayúsculas y minúsculas:

5.1.1 Método

El token Método indica el método que se realizará en el
recurso identificado por el URI de solicitud. El método distingue entre mayúsculas y 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
Carreras de ligereza en órbita
fuente
Otro comentario dijo que esta respuesta está obsoleta. ¿Es eso cierto? Si es así, tal vez pueda actualizarlo para que la gente no se confunda.
Speedplane
36

tldr; los encabezados HTTP / 1.1 y HTTP / 2 no distinguen entre mayúsculas y minúsculas.

De acuerdo con RFC 7230 (HTTP / 1.1):

Cada campo de encabezado consta de un nombre de campo que no distingue entre mayúsculas y minúsculas seguido de dos puntos (":"), espacios en blanco iniciales opcionales, el valor del campo y espacios en blanco finales opcionales.

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

Además, RFC 7540 (HTTP / 2):

Al igual que en HTTP / 1.x, los nombres de campo de encabezado son cadenas de
caracteres ASCII que se comparan entre mayúsculas y minúsculas.

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

Afshin Mehrabani
fuente
19
solo aclarando: los nombres de campo no distinguen entre mayúsculas y minúsculas; los valores de campo pueden ser sensibles a mayúsculas y minúsculas, dependiendo del nombre del campo.
Julian Reschke
77
Cita continua de HTTP / 2 RFC: "Sin embargo, los nombres de campo de encabezado DEBEN convertirse a minúsculas antes de su codificación en HTTP / 2. Una solicitud o respuesta que contenga nombres de campo de encabezado en mayúsculas DEBE tratarse como malformada (Sección 8.1.2.6)"
Borek Bernard
2
Acabo de notar que la parte "DEBE convertirse a minúsculas ..." también. ¿Porqué es eso? CamelCase parece ser la carcasa preferida en la práctica (herramientas de desarrollo, bibliotecas de códigos populares), entonces, ¿por qué HTTP / 2 intentaría ir en contra de esa tendencia?
jimp
77
@jimp, porque los estándares tienen que ver con la consistencia, el uso de camel-case puede ser ambiguo, especialmente con abreviaturas, inicializaciones y siglas. Por ejemplo, sería "Front-End-Https" o "Front-End-HTTPS" - "WWW-Authenticate" o "Www-Authenticate" - especificando todas las minúsculas elimina la ambigüedad al estandarizar el campo. Esto a su vez simplifica el manejo de los encabezados en todas partes.
Fraser
16

header('Content-type: image/png') no funcionaba con PHP 5.5 al servicio de IE11, ya que en la secuencia de imágenes se mostraba como texto

header('Content-Type: image/png') trabajado, ya que en la imagen apareció como una imagen

La única diferencia es la 'T' mayúscula.

Rudiger W.
fuente
18
Entonces, obviamente, hay un problema con la implementación porque se supone que todos los campos de encabezado deben leerse entre mayúsculas y minúsculas. Apache Bench también está en mal estado. No le gustan los nombres de campo en minúsculas.
enlace
8

No son sensibles a mayúsculas y minúsculas. De hecho, el servidor web NodeJS los convierte explícitamente a minúsculas, antes de ponerlos a disposición en el objeto de solicitud.

Es importante tener en cuenta aquí que todos los encabezados están representados solo en minúsculas, independientemente de cómo el cliente realmente los envió. Esto simplifica la tarea de analizar encabezados para cualquier propósito.

jayarjo
fuente
Esto se debe a que node / javascript distingue entre mayúsculas y minúsculas, por lo que para simplificar las cosas, normalizan todo a minúsculas, lo que significa que los encabezados HTTP en efecto no distinguen entre mayúsculas y minúsculas.
Svish
4

El RFC para HTTP (como se citó anteriormente) dicta que los encabezados no distinguen entre mayúsculas y minúsculas, sin embargo, encontrará que con ciertos navegadores (lo estoy mirando, IE), aprovechar cada una de las palabras tiende a ser mejor:

Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

Este no es el estándar "HTTP", pero solo otra de las peculiaridades del navegador, como desarrolladores, tenemos que pensar.

Robert Lerner
fuente
3
¿Podría proporcionar alguna evidencia al respecto?
Julian Reschke
3
Me refería a un caso de prueba concreto; Tengo un IE para probar.
Julian Reschke
11
¿Por qué exactamente tiende a ser mejor?
Svish
Haré un navegador que envíe encabezados con mayúsculas al azar solo para atornillar a los desarrolladores
GideonMax
0

oficialmente, los encabezados no distinguen entre mayúsculas y minúsculas, sin embargo, es una práctica común poner en mayúscula la primera letra de cada palabra.
pero, como es una práctica común, ciertos programas como IE asumen que los encabezados están en mayúsculas.
entonces, aunque los documentos dicen que no distinguen entre mayúsculas y minúsculas, los programadores malos básicamente han cambiado los documentos.

GideonMax
fuente
-4

la palabra Encabezados no distingue entre mayúsculas y minúsculas, pero a la derecha, como Tipo de contenido, es una buena práctica escribirla de esta manera, porque es sensible a mayúsculas y minúsculas. como mi ejemplo a continuación

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