¿Cuál es la diferencia de $ host y $ http_host en Nginx?

Respuestas:

217

$hostes una variable del módulo Core .

$ host

Esta variable es igual a la línea Host en el encabezado de la solicitud o el nombre del servidor que procesa la solicitud si el encabezado Host no está disponible.

Esta variable puede tener un valor diferente de $ http_host en tales casos: 1) cuando el encabezado de entrada del Host está ausente o tiene un valor vacío, $ host es igual al valor de la directiva server_name; 2) cuando el valor de Host contiene el número de puerto, $ host no incluye ese número de puerto. El valor de $ host siempre está en minúscula desde 0.8.17.

$http_hosttambién es una variable del mismo módulo, pero no la encontrará con ese nombre porque se define genéricamente como $http_HEADER( ref ).

$ http_HEADER

El valor del encabezado de solicitud HTTP HEADER cuando se convierte a minúsculas y con 'guiones' convertidos a 'guiones bajos', por ejemplo, $ http_user_agent, $ http_referer ...;


Resumiendo:

  • $http_hostsiempre es igual al HTTP_HOSTencabezado de la solicitud.
  • $hostigual $http_host, en minúscula y sin el número de puerto (si está presente), excepto cuando HTTP_HOSTestá ausente o es un valor vacío . En ese caso, $hostes igual al valor de la server_namedirectiva del servidor que procesó la solicitud.
Glarrain
fuente
57
$ host es específicamente el primeroserver_name que se define en el bloque del servidor actual. Si tiene varios correos server_nameelectrónicos, solo aparecerá el primero.
Jonathan Vanasco
44
Cierto. De hecho, es bastante típico definir: nombre_servidor example.com www.example.com;
glarrain
puedes tener múltiples server_namedirectivas también. Si tiene una expresión regular en la primera, eso se convierte en $host, y todo tipo de cosas feas pueden suceder durante las reglas de reescritura.
Jonathan Vanasco
55
¿La $server_namevariable es igual al server_namevalor de la directiva o al nombre real del servidor que se seleccionó si hubiera varias server_namedirectivas?
CMCDragonkai
1
@CMCDragonkai $server_namesiempre es igual al primer valor especificado con la directiva server_name. Por ejemplo, con server_name example.com one.example.com two.example.com;, $server_namesiempre será "example.com", independientemente de qué host haya especificado el usuario . De hecho, si no tiene un default_server, el host podría ser algo completamente diferente (como example.org).
ATLief