Según entiendo el enlace DNS, el nombre de dominio con la dirección IP del servidor en el que está almacenado el sitio web, ¿eso significa que cada servidor solo puede contener un sitio web? Si no lo hacen, ¿cómo sabe llamar a la dirección IP del servidor qué sitio web quiero si hay muchos en el mismo servidor?
80
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.).Respuestas:
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í:
(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.
Host
encabezado por el navegador en la solicitud HTTP.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.
fuente
Tengo esta explicación para personas no tecnológicas.
Jack, Jill y Joe viven en un dormitorio y no tienen teléfonos celulares.
En la agenda telefónica, todos están listados con el mismo número. (Un expediente)
Usted marca el número y alguien levanta el teléfono; dices "Me gustaría hablar con Jill" y la pones en línea.
En lugar de un registro A (número de teléfono / dirección IP) en la agenda, puede decir "Dormitory X", entonces debe buscar más el número de Dormitory X. Este es un registro CNAME.
Si Jill no está disponible, puede obtener
302 Jill está visitando a Peter, llámalo
400 No te entiendo.
451 Usted está violando su orden de restricción.
500 Nuestro sistema telefónico se ha averiado.
fuente
Primero, debe comprender que hay una serie de conceptos distintos aquí.
No hay una relación uno a uno entre ninguna de estas cosas. Un servidor puede tener múltiples direcciones IP; múltiples nombres de host pueden apuntar a una dirección IP; un nombre de host puede apuntar a múltiples direcciones IP. Varios sitios web pueden estar bajo el mismo nombre de host. Un sitio web puede distribuirse entre múltiples nombres de host.
En los viejos tiempos (HTTP 1.0 y anteriores) cada nombre de host que el servidor quería manejar de manera diferente tenía que tener su propia dirección IP. Esto fue bastante derrochador.
HTTP 1.1 agregó el
Host
"encabezado como un campo obligatorio en la solicitud HTTP (IIRC algunos proveedores habían admitido esto anteriormente como una extensión). Esto le dijo al servidor qué nombre de host se había solicitado y, por lo tanto, le permitió servir contenido diferente para diferentes nombres de host en el mismo Dirección IP. El soporte para HTTP 1.1 en clientes ahora es omnipresente.Desafortunadamente, SSL (luego TLS) agregó una arruga. El establecimiento de una sesión SSL / TLS requiere que el servidor presente un certificado al cliente que cubra el nombre de host solicitado, pero la solicitud HTTP no llega hasta que se establece la sesión SSL / TLS.
Es posible que un certificado cubra múltiples nombres de host mediante el uso del
SubjectAltName
campo o el uso de comodines en elCommonName
campo. Sin embargo, esto plantea desafíos administrativos, especialmente si los nombres de host involucrados están bajo dominios con propiedad diferente.Entonces TLS introdujo la extensión "indicación de nombre de servidor" (SNI). Con esta extensión, el cliente envía el nombre de host solicitado al servidor durante el procedimiento de enlace TLS. El servidor puede presentar el certificado apropiado. Desafortunadamente, si bien las versiones actuales de todas las principales implementaciones SSL / TLS son compatibles con SNI, las versiones anteriores han tardado mucho en dejar de usarse.
fuente
La respuesta es un poco más complicada de lo que algunas de las respuestas han hecho. Cuando realiza una búsqueda DNS, DEBE obtener una dirección IP (
A
registro para IPv4,AAAA
para IPv6). Debe poder abrir un socket a través de TCP / IP para comunicarse o todo falla. Esa dirección puede representar un servidor o puede representar un equilibrador de carga. Incluso podría representar un proxy. Si el host está detrás de CloudFlare, por ejemplo, la dirección que obtiene es de un servidor CloudFlare. El servidor real está en otro lugar. Esto permite que el host evite problemas como los ataques de denegación de servicio.El alojamiento virtual es lo que está preguntando (algunas de las otras preguntas se tocaron sobre esto, pero no con ningún detalle). El alojamiento virtual toma la solicitud web y mira el nombre del host (es decir, dominio.com) para determinar qué sitio web debe servir. Entonces, en el servidor web Apache HTTP , tendría una configuración como esta
Esto se simplifica por ejemplo. Por lo tanto, le estamos diciendo a Apache que escuche en el puerto 80 cualquier IP (en la máquina virtual moderna que aloja la IP de su máquina puede ser diferente de su IP en vivo). Luego le decimos que este es el
domain.com
sitio web y bajo qué directorio vive ese sitio web. Luego podemos repetir este bloque una y otra vez para decirle a Apache que maneje diferentes sitios web. Todos los servidores web admiten este tipo de sistema.Otra forma de manejar esto sería decirle al servidor web que dirija todo el tráfico web a un solo script de programación (es decir, PHP, ASP.NET, etc.) y luego ese único script determinará qué sitio web y página mostrar.
fuente
Con DNS, puede asignar tantos nombres a una dirección IP individual como desee (en su archivo de hosts , simplemente puede separar cada nombre con espacios, por ejemplo). Usando un servidor DNS también puede asignar múltiples direcciones IP a un solo nombre . No se limita a una relación uno a uno.
Un servidor web sabe qué sitio servir al examinar la URL solicitada. Analiza qué dominio se solicitó, el puerto que se solicitó y qué protocolo se utilizó. Esto no tiene nada que ver con DNS y es manejado por el protocolo HTTP.
fuente
El servidor web tiene el concepto de contenedor host ( aquí está la documentación de Tomcat, por ejemplo). Se pueden configurar varios contenedores de host para el mismo cuadro / dirección IP, atendiendo múltiples dominios. Los contenedores tienen directorios de trabajo independientes, reinos de autenticación, directorios de registro y cosas similares.
El servidor encuentra el contenedor relevante para la nueva solicitud. El nombre del dominio es parte de esta solicitud HTTP.
Instancias de servidor web completamente diferentes pueden compartir la misma dirección IP si se ejecutan en diferentes puertos. Esto se usa principalmente en varios entornos de desarrollo y prueba donde los nombres de dominio pueden no estar disponibles, ya que el servidor de producción no puede ejecutarse en un puerto arbitrario.
Finalmente, incluso si se requiere una dirección IP estrictamente única para un sitio web, una caja de servidor a menudo tiene múltiples adaptadores de red, por lo que está configurada para usar múltiples direcciones IP.
fuente
La dirección IP de su servidor puede contener muchos nombres de dominio diferentes al mismo tiempo.
Cuando accede al sitio web, su navegador envía la solicitud HTTP con el nombre de dominio, y el servidor puede encontrar qué datos del sitio web debe enviarle en ese momento.
Se llama hosts virtuales, tan simple como eso :)
Eche un vistazo aquí para obtener más información sobre DNS y hosts virtuales.
fuente