Saltar al contenido

¿Cuál es la diferencia entre las variables de Nginx $ host, $ http_host y $ server_name?

Solución:

Solución 1:

Casi siempre deberías usar $host, ya que es el único garantizado para tener algo sensato independientemente de cómo se comporte 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: el nombre de host de la línea de solicitud, o el 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 la server_name del host virtual que procesó la solicitud, como se definió en la configuración de nginx. Si un server contiene múltiples server_names, solo el primero estará presente en esta variable.

Dado que es legal para los agentes de usuario enviar 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 proxies, debe tener en cuenta esto.

También debe tener en cuenta el caso en el que el agente de usuario no envía ningún nombre de host, 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 a varios sitios web, o si solo tiene un único sitio web en su servidor, puede procesar todo a través de un solo host virtual . En el último caso, también debe tener en cuenta esto.

Solo el $host La variable tiene en cuenta todas las cosas posibles que un agente de usuario puede hacer al formar una solicitud HTTP.

Solucion 2:

Me gustaría agregar otro punto importante que no se menciona en la respuesta aceptada.

$host hacer NO tener número de puerto, mientras $http_host incluye el número de puerto.

editar: no siempre.

Configuré un encabezado “add_header Y-blog-http_host” $ http_host “always;”

Luego curl -I -L domain.com:80 (o 443) y el encabezado no muestra ningún número de puerto. Verificado con nginx-extra 1.10.3. ¿Es porque son puertos http comunes o configuración nginx? Este comentario solo para decir cosas que no siempre compórtate como piensas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *