Detetive PHP: o que está por trás de HTTP_HOST e SERVER_NAME?
\n\nSe 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.
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\nO que é HTTP_HOST?
\nHTTP_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.
Exemplo de requisição do navegador:
\nGET /pagina.php HTTP/1.1\nHost: pythonlib.com.br:8080\nUser-Agent: Mozilla/5.0\n...\nNo 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.
O que é SERVER_NAME?
\nSERVER_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.
Exemplo de configuração Apache:
\n<VirtualHost *:80>\n ServerName pythonlib.com.br\n DocumentRoot /var/www/pythonlib\n</VirtualHost>\nNesse 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).
Principais diferenças em tabela
\nPara facilitar, vamos resumir tudo em uma tabela:
\n| Parâmetro | \nHTTP_HOST | \nSERVER_NAME | \n
|---|---|---|
| Origem | \nCabeçalho da requisição HTTP do cliente | \nConfiguração do servidor web | \n
| Controle | \nCliente (pode ser falsificado) | \nAdministrador do servidor | \n
| Porta | \nInclui a porta se não for padrão (ex.: site.com:8080) | \n Geralmente sem porta (depende de UseCanonicalName) | \n
| Confiabilidade | \nBaixa (não confie sem verificar) | \nAlta (mas não absoluta) | \n
| Uso | \nRedirecionamentos, links para o usuário | \nLógica interna, segurança | \n
Quando usar cada um? Exemplos práticos
\nAgora vamos ao que realmente importa: o código. Veja três cenários típicos.
\n\n