Basicamente: o navegador inclui o nome do domínio na solicitação HTTP, portanto, o servidor da Web sabe qual domínio foi solicitado e pode responder de acordo.
Solicitações HTTP
Veja como sua solicitação HTTP típica acontece:
-
O usuário fornece uma URL, no formulário
http://host:port/path
. -
O navegador extrai a parte do host (domínio) da URL e a converte em um endereço IP, se necessário, em um processo conhecido como resolução de nomes . Essa tradução pode ocorrer via DNS, mas não precisa (por exemplo, o arquivo
hosts
local em sistemas operacionais comuns ignora o DNS). -
O navegador abre uma conexão TCP com a porta especificada ou padroniza a porta 80 nesse endereço IP.
-
O navegador envia uma solicitação HTTP. Para o HTTP / 1.1, é assim:
GET /path HTTP/1.1 Host: example.com
(O cabeçalho
Host
é padrão e requerido no HTTP / 1.1. Ele não foi especificado na especificação HTTP / 1.0, mas alguns servidores o suportam mesmo assim.)
A partir daqui, o servidor da Web tem várias informações que podem ser usadas para decidir qual deve ser a resposta. Observe que é possível que um único servidor da web seja vinculado a vários endereços IP.
- O endereço IP solicitado, do soquete TCP
- O endereço IP do cliente também está disponível, mas isso raramente é usado - às vezes, para bloquear / filtrar
- A porta solicitada, do soquete TCP
- O nome do host solicitado, conforme especificado no cabeçalho
Host
pelo navegador na solicitação HTTP. - O caminho solicitado
- Quaisquer outros cabeçalhos (cookies, etc.)
Como você parece ter notado, a configuração de hospedagem compartilhada mais comum atualmente coloca vários sites em um único endereço IP: combinação de portas, deixando apenas Host
para diferenciar entre sites.
Isso é conhecido como Host virtual baseado em nome no Apache-land, enquanto o Nginx os chama Nomes de servidores em blocos de servidores e o IIS prefere Servidor virtual .
E quanto ao HTTPS?
O HTTPS é um pouco diferente. Tudo é idêntico ao estabelecimento da conexão TCP, mas depois disso um túnel TLS criptografado deve ser estabelecido. O objetivo é não vazar nenhuma informação sobre a solicitação.
Para verificar se o servidor possui realmente este domínio, o servidor deve enviar um certificado assinado por um terceiro confiável. O navegador comparará esse certificado com o domínio solicitado.
Isso apresenta um problema. Como o servidor sabe qual certificado do host (site) enviar, se ele precisa fazer isso antes que a solicitação HTTP seja recebida?
Tradicionalmente, isso foi resolvido com um endereço IP dedicado (ou porta) para todos os sites que exigem HTTPS. Obviamente, isso se torna problemático à medida que começamos a ficar sem endereços IPv4.
Digite SNI (indicação do nome do servidor). O navegador agora passa o nome do host durante as negociações de TLS, portanto, o servidor tem essas informações com antecedência suficiente para enviar o certificado correto. No lado do servidor, a configuração é muito parecida com a configuração dos hosts virtuais HTTP.
A desvantagem é que o nome do host agora é passado como texto sem formatação antes da criptografia e é essencialmente uma informação que vazou. Isso geralmente é considerado uma troca aceitável, considerando que o nome do host é normalmente exposto em uma consulta DNS de qualquer maneira.
E se você solicitar um site apenas por endereço IP?
O que o servidor faz quando não sabe qual host específico você solicitou depende da implementação e configuração do servidor. Normalmente, há um site "default", "catchall" ou "fallback" especificado que fornecerá respostas a todas as solicitações que não especificarem explicitamente um host.
Esse site padrão pode ser seu próprio site independente (geralmente mostrando uma mensagem de erro) ou pode ser qualquer um dos outros sites no servidor, dependendo da preferência do administrador do servidor.