Você quase sempre deve usar $host
, pois é o único que garante algo sensato, independentemente de como o agente do usuário se comporte, 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 da solicitação, ou nome do host do campo de cabeçalho da solicitação 'Host' ou o nome do servidor que corresponde a uma solicitação"
$http_host
contém o conteúdo do campo de cabeçalho "Host" HTTP, se estiver presente na solicitação
$server_name
contém o server_name
host virtual que processou a solicitação, conforme definido na configuração nginx. Se a server
contiver vários server_name
s, apenas o primeiro estará presente nessa variável.
Como é legal para os agentes do usuário enviarem o nome do host na linha de solicitação, e não no cabeçalho Host:, embora isso raramente seja feito, exceto quando você se conectar a proxies, é necessário prestar contas.
Você também deve considerar o caso em que o agente do usuário não envia um nome de host, por exemplo, solicitações HTTP / 1.0 antigas e software moderno e mal escrito. Você pode fazer isso desviando-os para um host virtual abrangente que não serve para nada, se você estiver servindo vários sites ou se tiver apenas um site no servidor, poderá processar tudo por meio de um único host virtual . Neste último caso, você também deve explicar isso.
Somente a $host
variável é responsável por todas as coisas possíveis que um agente do usuário pode fazer ao formar uma solicitação HTTP.
$scheme
e$host
...return 301 /forum/index.php?posts/$arg_p/;
funciona bem.