Básicamente: el navegador incluye el nombre de dominio en la solicitud HTTP, por lo que el servidor web sabe qué dominio se solicitó y puede responder en consecuencia.
Solicitudes HTTP
Así es como ocurre su solicitud HTTP típica:
El usuario proporciona una URL, en el formulario http://host:port/path
.
El navegador extrae la parte del host (dominio) de la URL y la traduce a una dirección IP si es necesario, en un proceso conocido como resolución de nombre . Esta traducción puede ocurrir a través de DNS, pero no es necesario (por ejemplo, el hosts
archivo local en sistemas operativos comunes omite DNS).
El navegador abre una conexión TCP al puerto especificado, o por defecto al puerto 80, en esa dirección IP.
El navegador envía una solicitud HTTP. Para HTTP / 1.1, se ve así:
GET /path HTTP/1.1
Host: example.com
(El Host
encabezado es estándar y se requiere en HTTP / 1.1. No se especificó en la especificación HTTP / 1.0, pero algunos servidores lo admiten de todos modos).
A partir de aquí, el servidor web tiene varios datos que puede usar para decidir cuál debería ser la respuesta. Tenga en cuenta que es posible que un único servidor web esté vinculado a varias direcciones IP.
- La dirección IP solicitada, desde el socket TCP
- La dirección IP del cliente también está disponible, pero rara vez se usa, a veces para bloquear / filtrar
- El puerto solicitado, desde el socket TCP
- El nombre de host solicitado, según lo especificado en el
Host
encabezado por el navegador en la solicitud HTTP.
- La ruta solicitada
- Cualquier otro encabezado (cookies, etc.)
Como parece haber notado, la configuración de alojamiento compartido más común en estos días coloca múltiples sitios web en una sola dirección IP: combinación de puertos, dejando solo Host
diferenciar entre sitios web.
Esto se conoce como un host virtual basado en nombres en Apache-land, mientras que Nginx los llama nombres de servidores en bloques de servidores e IIS prefiere el servidor virtual .
¿Qué pasa con HTTPS?
HTTPS es un poco diferente. Todo es idéntico hasta el establecimiento de la conexión TCP, pero después de eso se debe establecer un túnel TLS encriptado. El objetivo es no filtrar ninguna información sobre la solicitud.
Para verificar que el servidor realmente posee este dominio, el servidor debe enviar un certificado firmado por un tercero de confianza. El navegador comparará este certificado con el dominio que solicitó.
Esto presenta un problema. ¿Cómo sabe el servidor qué certificado de host (sitio web) enviar, si necesita hacerlo antes de recibir la solicitud HTTP?
Tradicionalmente, esto se resolvió teniendo una dirección IP (o puerto) dedicada para cada sitio web que requiera HTTPS. Obviamente, esto se vuelve problemático cuando comenzamos a quedarnos sin direcciones IPv4.
Ingrese SNI (Indicación del nombre del servidor). El navegador ahora pasa el nombre de host durante las negociaciones de TLS, por lo que el servidor tiene esta información lo suficientemente pronto como para enviar el certificado correcto. En el lado del servidor, la configuración es muy similar a cómo se configuran los hosts virtuales HTTP.
La desventaja es que el nombre de host ahora se pasa como texto sin formato antes del cifrado, y es esencialmente información filtrada. Esto generalmente se considera una compensación aceptable, considerando que el nombre de host normalmente está expuesto en una consulta DNS de todos modos.
¿Qué sucede si solicita un sitio solo por dirección IP?
Lo que hace el servidor cuando no sabe qué host específico solicitó depende de la implementación y configuración del servidor. Normalmente, se especifica un sitio "predeterminado", "general" o "alternativo" que proporcionará respuestas a todas las solicitudes que no especifiquen explícitamente un host.
Este sitio predeterminado puede ser su propio sitio independiente (a menudo muestra un mensaje de error), o podría ser cualquiera de los otros sitios en el servidor, dependiendo de la preferencia del administrador del servidor.
Host:
encabezado. En el caso del alojamiento compartido, el proveedor puede configurar el servidor web para que lo gestione de diferentes maneras (por ejemplo, tener un valor predeterminado, redirigir al proveedor, etc.).