Qual é a diferença entre variáveis Nginx $ host, $ http_host e $ server_name?

30

Qual é a diferença entre as três variáveis Nginx $host , $http_host e $server_name ?

Eu tenho uma regra de reescrita onde não tenho certeza qual deles devo usar:

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

Estou procurando uma resposta que não diga apenas 'use

por Jeff Widman 17.07.2015 / 03:50

2 respostas

44

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 o server_name do host virtual que processou a solicitação, conforme definido na configuração nginx. Se um server contiver vários server_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.

    
por 17.07.2015 / 04:07
0

Gostaria de acrescentar outro ponto importante não mencionado na resposta aceita.

$host do NÃO tem número de porta, enquanto $http_host DO inclui o número da porta.

editar : nem sempre.

Eu configurei um cabeçalho "add_header Y-blog-http_host" $ http_host "sempre;"

Em seguida, curl -I -L domain.com:80 (ou 443) e o cabeçalho não mostram um número de porta. Verificado com nginx-extra 1.10.3. É porque são portas http comuns ou configuração nginx? Este comentário apenas para dizer que as coisas não sempre se comportam da maneira que você pensa.

    
por 04.01.2018 / 02:37