Você deve quase sempre usar $host
, pois é o único que garante ter algo sensato, independentemente de como o user-agent se comporta, a menos que você precise especificamente da semântica de uma das outras variáveis.
A diferença é explicada na documentação do nginx :
-
$host
contém "nesta ordem de precedência: nome do host da linha de solicitação ou nome do host do campo de cabeçalho de solicitação 'Host' ou o nome do servidor correspondente a uma solicitação" -
$http_host
contém o conteúdo do campo de cabeçalho HTTP "Host", se estiver presente na solicitação -
$server_name
contém oserver_name
do host virtual que processou a solicitação, conforme definido na configuração nginx. Se umserver
contiver váriosserver_name
s, apenas o primeiro estará presente nesta variável.
Como é legal para o user-agent enviar o nome do host na linha de solicitação, em vez de em um cabeçalho Host: embora isso raramente seja feito, exceto ao conectar-se a proxies, você deve considerar isso.
Você também deve considerar o caso em que o user-agent não envia um nome de host, por exemplo, solicitações HTTP / 1.0 antigas e software moderno mal escrito. Você pode fazer isso desviando-os para um host virtual que não serve para nada, se estiver atendendo a vários sites ou, se tiver apenas um único site em seu servidor, poderá processar tudo por meio de um único host virtual . Neste último caso, você também deve considerar isso.
Apenas a variável $host
é responsável por todas as coisas possíveis que um user-agent pode fazer ao formar uma solicitação HTTP.