O que é cabeçalho de host http?

120

Dado que a conexão TCP já está estabelecida quando a solicitação HTTP é enviada, o endereço IP e a porta são implicitamente conhecidos - uma conexão TCP é um IP + Porta. Então, por que precisamos do Hostcabeçalho? Isso é necessário apenas para o caso em que há vários hosts mapeados para o endereço IP implícito na conexão TCP?

Vladimir Lenin
fonte

Respostas:

140

O hostcabeçalho informa ao servidor da web qual host virtual usar (se configurado). Você pode até ter o mesmo host virtual usando vários aliases (= domínios e domínios-curinga). Nesse caso, você ainda tem a possibilidade de ler esse cabeçalho manualmente em seu aplicativo da web se desejar fornecer um comportamento diferente com base em diferentes domínios endereçados. Isso é possível porque em seu servidor da web você pode (e se não me engano, você deve) configurar um vhost para ser o host padrão. Este vhost padrão é usado sempre que o hostcabeçalho não corresponde a nenhum dos hosts virtuais configurados.

Isso significa: você acertou, embora dizer "vários hosts" possa ser um tanto enganoso: o host (a máquina endereçada) é o mesmo, o que realmente é resolvido para o endereço IP são nomes de domínio diferentes (incluindo subdomínios) que também são referidos para como nomes de host (mas não hosts!).

Embora não faça parte da pergunta, um fato engraçado: essa especificação causou problemas com SSL nos primeiros dias porque o servidor da web tem que entregar o certificado que corresponde ao domínio que o cliente endereçou. No entanto, para saber qual certificado usar, o servidor da web deve saber o nome do host endereçado com antecedência. Mas, como o cliente envia essa informação apenas pelo canal criptografado (o que significa: depois que o certificado já foi enviado), o servidor teve que assumir que você navegou no host padrão. Isso significava um domínio protegido por SSL por combinação de endereço IP / porta.

Isso foi superado com a indicação do nome do servidor ; no entanto, isso quebra alguma privacidade, já que o nome do servidor agora é transferido em texto simples novamente, de modo que cada intermediário veria a qual nome de host você está tentando se conectar.

Embora o servidor da web conheça o nome do host da Indicação do nome do servidor, o hostcabeçalho não é obsoleto, porque as informações da Indicação do nome do servidor são usadas apenas no handshake TLS. Com uma conexão não segura, não há nenhuma indicação de nome de servidor, portanto, o hostcabeçalho ainda é válido (e necessário).

Outro fato engraçado: a maioria dos servidores web (se não todos) rejeitam sua solicitação http se ela não contiver exatamente um hostcabeçalho, mesmo que possa ser omitido porque há apenas o vhost padrão configurado. Isso significa que o mínimo exigido informações em uma solicitação em HTTP (get-) é a primeira linha contendo METHOD RESOURCEe PROTOCOL VERSIONe pelo menos o host-header, como este:

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

Na documentação do MDN no cabeçalho do host, eles realmente expressam assim:

Um campo de cabeçalho Host deve ser enviado em todas as mensagens de solicitação HTTP / 1.1. Um código de status 400 (Bad Request) será enviado para qualquer mensagem de solicitação HTTP / 1.1 que não tenha um campo de cabeçalho Host ou contenha mais de um.

Conforme mencionado por Darrel Miller, as especificações completas podem ser encontradas em RFC7230 .

Psi
fonte
boa resposta. Você escreveu "Isso é possível porque em seu servidor da web você pode (e se não me engano, você deve) configurar um vhost para ser o host padrão. Este vhost padrão é usado sempre que o cabeçalho do host não corresponde a nenhum dos virtuais configurados hosts. " Eu queria verificar em RFC7230, mas não encontrei vhostapenas 3 ocorrências próximas de virtual hostcom significado não próximo à sua frase e 12 para defaultprincipalmente sobre o porto,
Alexei Martianov
sobre o host apenas que: "Se não, se um campo de cabeçalho do Host for fornecido com um valor de campo não vazio, o componente de autoridade será o mesmo que o valor do campo do Host." - não IMHO o mesmo. Você pode me apontar para apontar no RFC sobre isso?
Alexei Martianov
lado prático: para algum servidor eu envio POST com cabeçalho host = nome de domínio e recebo 200 (ok), envio o cabeçalho do host alterado e recebo 404 (não encontrado). Isso pode significar que o servidor não está by the bookconfigurado corretamente (totalmente )?
Alexei Martianov
porque o comentário não pode ser editado: a citação em 2 ° foi defaultencontrada perto da palavra pela pesquisa,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov
estranho. todas as 3 ocorrências de virtual hostencontradas por minha pesquisa em tools.ietf.org/html/rfc7230 estão em Appendix A. HTTP Version History. parece que sua pesquisa encontrou algum outro.
Alexei Martianov
29

Eu sempre recomendaria ir à fonte oficial ao tentar entender o significado e o propósito dos cabeçalhos HTTP.

O campo de cabeçalho "Host" em uma solicitação fornece as
informações de host e porta do URI de destino, permitindo ao servidor de origem
distinguir entre recursos enquanto atende a solicitações de vários
nomes de host em um único endereço IP.

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

Darrel Miller
fonte