¿Qué es el encabezado de host http?

120

Dado que la conexión TCP ya está establecida cuando se envía la solicitud HTTP, la dirección IP y el puerto se conocen implícitamente: una conexión TCP es un puerto IP +. Entonces, ¿por qué necesitamos el Hostencabezado? ¿Es esto solo necesario para el caso de que haya varios hosts asignados a la dirección IP implícita en la conexión TCP?

Vladimir Lenin
fuente

Respuestas:

140

El hostencabezado le dice al servidor web qué host virtual usar (si está configurado). Incluso puede tener el mismo host virtual utilizando varios alias (= dominios y dominios comodín). En este caso, aún tiene la posibilidad de leer ese encabezado manualmente en su aplicación web si desea proporcionar un comportamiento diferente según los diferentes dominios dirigidos. Esto es posible porque en su servidor web puede (y si no me equivoco debe) configurar un vhost para que sea el host predeterminado. Este vhost predeterminado se utiliza siempre que el hostencabezado no coincide con ninguno de los hosts virtuales configurados.

Eso significa: lo hace bien, aunque decir "múltiples hosts" puede ser algo engañoso: el host (la máquina direccionada) es el mismo, lo que realmente se resuelve en la dirección IP son diferentes nombres de dominio (incluidos los subdominios) que también se refieren a como nombres de host (¡pero no hosts!).

Aunque no es parte de la pregunta, un dato curioso: esta especificación generó problemas con SSL en los primeros días porque el servidor web tiene que entregar el certificado que corresponde al dominio que el cliente ha abordado. Sin embargo, para saber qué certificado utilizar, el servidor web debería haber conocido el nombre de host direccionado de antemano. Pero debido a que el cliente envía esa información solo a través del canal encriptado (lo que significa: después de que el certificado ya se haya enviado), el servidor tuvo que asumir que usted navegó por el host predeterminado. Eso significaba un dominio protegido por SSL por combinación de puerto / dirección IP.

Esto se ha superado con la indicación del nombre del servidor ; sin embargo, eso nuevamente rompe algo de privacidad, ya que el nombre del servidor ahora se transfiere nuevamente en texto sin formato, por lo que todos los intermediarios verán a qué nombre de host está tratando de conectarse.

Aunque el servidor web conocería el nombre de host de la Indicación del nombre del servidor, el hostencabezado no está obsoleto, porque la información de la Indicación del nombre del servidor solo se usa dentro del protocolo de enlace TLS. Con una conexión no segura, no hay ninguna indicación de nombre de servidor, por lo que el hostencabezado sigue siendo válido (y necesario).

Otro dato divertido: la mayoría de los servidores web (si no todos) rechazan su solicitud http si no contiene exactamente un hostencabezado, incluso si podría omitirse porque solo hay configurado el vhost predeterminado. Eso significa que la información mínima requerida en una solicitud http- (get-) es la primera línea que contiene METHOD RESOURCEy PROTOCOL VERSIONy al menos el host-header, así:

GET /someresource.html HTTP/1.1
Host: www.example.com

En la documentación de MDN sobre el encabezado del host , en realidad lo expresan así:

Se debe enviar un campo de encabezado de host en todos los mensajes de solicitud HTTP / 1.1. Se enviará un código de estado 400 (Solicitud incorrecta) a cualquier mensaje de solicitud HTTP / 1.1 que no tenga un campo de encabezado de host o contenga más de uno.

Como lo mencionó Darrel Miller, las especificaciones completas se pueden encontrar en RFC7230 .

Psi
fuente
buena respuesta. Escribiste "Esto es posible porque en tu servidor web puedes (y si no me equivoco debes) configurar un vhost para que sea el host predeterminado. Este vhost predeterminado se usa siempre que el encabezado del host no coincide con ninguno de los Hospedadores." Quería verificar en RFC7230 pero no encontré vhostsolo 3 ocurrencias cercanas de virtual hostcon un significado que no se acerca a su frase y 12 para la defaultmayoría sobre el puerto,
Alexei Martianov
sobre el host solo eso: "Si no, entonces si un campo de encabezado de Host se proporciona con un valor de campo no vacío, el componente de autoridad es el mismo que el valor de campo de Host". - No en mi humilde opinión lo mismo. ¿Me puedes señalar para señalar en RFC sobre eso?
Alexei Martianov
lado práctico: a algún servidor envío POST con encabezado host = nombre de dominio y obtengo 200 (ok), envío el encabezado de host cambiado y obtengo 404 (no encontrado). ¿Podría significar que el servidor no está by the bookconfigurado correctamente (completamente )?
Alexei Martianov
ya que el comentario no se puede editar: la cita en el segundo lugar estaba cerca de la defaultpalabra encontrada por la búsqueda,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov
extraño. las 3 apariciones de virtual hostmi búsqueda en tools.ietf.org/html/rfc7230 están en formatoAppendix A. HTTP Version History . parece que su búsqueda encontró otro.
Alexei Martianov
29

Siempre recomendaría acudir a la fuente autorizada cuando intente comprender el significado y el propósito de los encabezados HTTP.

El campo de encabezado "Host" en una solicitud proporciona la
información de host y puerto del URI de destino, lo que permite que el servidor de origen
distinga los recursos mientras atiende las solicitudes de varios
nombres de host en una sola dirección IP.

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

Darrel Miller
fuente