Casi siempre debe usar $host
, ya que es el único garantizado para tener algo sensible, independientemente de cómo se comporta el agente de usuario, a menos que necesite específicamente la semántica de una de las otras variables.
La diferencia se explica en la documentación de nginx :
$host
contiene "en este orden de precedencia: nombre de host de la línea de solicitud, o nombre de host del campo de encabezado de solicitud 'Host', o el nombre del servidor que coincide con una solicitud"
$http_host
contiene el contenido del campo de encabezado HTTP "Host", si estaba presente en la solicitud
$server_name
contiene el server_name
del host virtual que procesó la solicitud, tal como se definió en la configuración de nginx. Si a server
contiene múltiples server_name
s, solo el primero estará presente en esta variable.
Dado que es legal que los agentes de usuario envíen el nombre de host en la línea de solicitud en lugar de en un encabezado Host: aunque rara vez se hace, excepto cuando se conecta a servidores proxy, debe tener esto en cuenta.
También debe tener en cuenta el caso en el que el agente de usuario no envía un nombre de host en absoluto, por ejemplo, solicitudes HTTP / 1.0 antiguas y software moderno mal escrito. Puede hacerlo desviándolos a un host virtual general que no sirve nada, si está sirviendo múltiples sitios web, o si solo tiene un único sitio web en su servidor, puede procesar todo a través de un único host virtual . En este último caso, también debe tener esto en cuenta.
Solo la $host
variable tiene en cuenta todas las cosas posibles que un agente de usuario puede hacer al formar una solicitud HTTP.
$scheme
y$host
...return 301 /forum/index.php?posts/$arg_p/;
funciona bien.