HTTP_HOST vs SERVER_NAME no PHP: qual a diferença?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Detetive PHP: o que está por trás de HTTP_HOST e SERVER_NAME?

\n\n

Se você já deu uma olhada no array superglobal $_SERVER no PHP, certamente viu duas chaves muito parecidas: HTTP_HOST e SERVER_NAME. À primeira vista, parecem a mesma coisa — o nome do servidor. Mas desenvolvedores experientes sabem: o diabo está nos detalhes. Esse tópico já gerou milhares de visualizações no Stack Overflow, e não é à toa. Escolher errado pode causar bugs em redirecionamentos, falhas em requisições entre domínios e até vulnerabilidades de segurança.

\n

Neste artigo, não vamos apenas listar definições secas. Vamos fazer uma verdadeira investigação: entender de onde vêm esses valores, como se comportam em servidores diferentes (Apache, Nginx) e, o mais importante, quando usar cada um. Aperte os cintos, vai ser interessante.

\n\n

O que é HTTP_HOST?

\n

HTTP_HOST é o valor do cabeçalho Host que o navegador (ou qualquer outro cliente HTTP) envia ao servidor como parte da requisição. Esse cabeçalho é obrigatório no HTTP/1.1 e contém o nome do domínio e, possivelmente, o número da porta.

\n

Exemplo de requisição do navegador:

\n
GET /pagina.php HTTP/1.1\nHost: pythonlib.com.br:8080\nUser-Agent: Mozilla/5.0\n...
\n

No PHP, esse valor vai para $_SERVER['HTTP_HOST']. Atenção: este é um valor não verificado. O cliente pode enviar qualquer texto no cabeçalho Host, como site-malicioso.com ou 192.168.1.1. É aí que mora o perigo.

\n\n

O que é SERVER_NAME?

\n

SERVER_NAME é o valor definido pelo próprio servidor web com base na sua configuração. Geralmente, vem da diretiva ServerName no Apache ou server_name no Nginx. É o nome do host virtual que processou a requisição.

\n

Exemplo de configuração Apache:

\n
<VirtualHost *:80>\n    ServerName pythonlib.com.br\n    DocumentRoot /var/www/pythonlib\n</VirtualHost>
\n

Nesse caso, $_SERVER['SERVER_NAME'] será igual a pythonlib.com.br. Diferente de HTTP_HOST, esse valor é controlado pelo administrador do servidor, não pelo cliente. Porém, há um detalhe: SERVER_NAME pode não incluir a porta (depende da configuração UseCanonicalName).

\n\n

Principais diferenças em tabela

\n

Para facilitar, vamos resumir tudo em uma tabela:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParâmetroHTTP_HOSTSERVER_NAME
OrigemCabeçalho da requisição HTTP do clienteConfiguração do servidor web
ControleCliente (pode ser falsificado)Administrador do servidor
PortaInclui a porta se não for padrão (ex.: site.com:8080)Geralmente sem porta (depende de UseCanonicalName)
ConfiabilidadeBaixa (não confie sem verificar)Alta (mas não absoluta)
UsoRedirecionamentos, links para o usuárioLógica interna, segurança
\n\n

Quando usar cada um? Exemplos práticos

\n

Agora vamos ao que realmente importa: o código. Veja três cenários típicos.

\n\n

1. Redirecionamento para o mesmo domínio (ex.: com www

Blogs

Book Recommendations