diferencia entre _default _: * y *: * en el contexto de VirtualHost

35

Quiero saber la diferencia entre " default : *" y "*: *" en VirtualHost Context.

<VirtualHost _default_:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

<VirtualHost *:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

No sé la diferencia y el propósito de uso.

Thk

Luigi Giuseppe
fuente

Respuestas:

40

La solución está en la documentación de Apache 2.2 en la directiva Virtualhost :

Sintaxis: ... (...) Addr puede ser:

  • La dirección IP del host virtual;
  • Un nombre de dominio completo para la dirección IP del host virtual (no recomendado);
  • El carácter * , que se usa solo en combinación con NameVirtualHost * para hacer coincidir todas las direcciones IP; o
  • La cadena _default_ , que se usa solo con el alojamiento virtual IP para capturar direcciones IP no coincidentes.

Existen dos formas de manejar Virtualhosts, Virtualhosting basado en nombre y Virtualhosting basado en IP.

Con los hosts virtuales basados ​​en nombres tiene una lista de hosts virtuales, cada uno de los cuales administra uno o varios nombres de dominio, y cada uno asociado con un par listening IP:port. *es un valor especial que significa todas las IP en este host . El virtualHost predeterminado es el primero declarado en esta lista para cada dirección de escucha dada.

Con VirtualHosts basado en IP, ServerNameno se usa la directiva de VirtualHost, la información importante es la IP de escucha (y el puerto), y el VirtualHost predeterminado es el primero que coincide con la IP que maneja la solicitud entrante.

Entonces, con una configuración de alojamiento virtual basada en nombre:

  • <Virtualhost *:80> with ServerName foo.com significa "en todas las IP administradas en este host", "en el puerto 80", "si el encabezado del host de solicitud es foo.com" Usaré este host virtual
  • <Virtualhost *:*> with Servername foo.com significa "en todas las IP administradas en este host", "en todos los puertos", "si el encabezado del host de solicitud es foo.com" Usaré este host virtual
  • <Virtualhost 10.0.0.2:*> with Servername foo.com significa "para la solicitud entrante desde mi interfaz de red 10.0.0.2", "en todos los puertos", "si el encabezado del host de solicitud es foo.com" Usaré este host virtual
  • <Virtualhost _default_:*> with Servername foo.com : no debe usarse con alojamiento virtual basado en nombres

Y en un alojamiento virtual basado en IP:

  • <Virtualhost 10.0.0.2:*> significa "Usaré este host virtual para solicitudes que lleguen a mi interfaz 10.0.0.2"
  • <Virtualhost _default_:443> significa "Usaré este host virtual para todas las demás interfaces de red en mi host para solicitudes que lleguen al puerto 443"
  • <Virtualhost _default_:*> significa "Usaré este virtualhost para todas las demás interfaces de red en mi host, si no coincide con una regla anterior y si el encabezado del host de solicitud no coincide con un virtualhost con nombre"

Por lo tanto, se trata de definir un Virtualhost general. La documentación agrega:

Cuando se utiliza un alojamiento virtual basado en IP, _default_se puede especificar el nombre especial, en cuyo caso este host virtual coincidirá con cualquier dirección IP que no esté explícitamente listada en otro host virtual. En ausencia de cualquier _default_host virtual, la configuración del servidor "principal", que consiste en todas esas definiciones fuera de cualquier sección de VirtualHost, se utiliza cuando no se produce una coincidencia de IP. (Pero tenga en cuenta que cualquier dirección IP que coincida con una directiva NameVirtualHost no utilizará ni la configuración del servidor "principal" ni el _default_host virtual. Consulte la documentación del alojamiento virtual basado en el nombre para obtener más detalles).

Entonces, después de todas estas cosas, queda bastante "claro" que mezclar alojamiento virtual basado en IP y en nombre podría convertirse en un desastre. Con Apache 2.2, el alojamiento virtual basado en nombres solo se usaba si NameVirtualhost <something>se usaba.

Pero con la nueva versión de Apache 2.4 , estas cosas son realmente más fáciles de entender, sin NameVirtualhostdeclaración. La directiva NameVirtualHost ya no tiene ningún efecto, aparte de emitir una advertencia. Cualquier combinación de dirección / puerto que aparezca en varios hosts virtuales se trata implícitamente como un host virtual basado en el nombre . No más pensamientos complejos, incluso la documentación ahora es más simple:

  • El carácter *, que actúa como comodín y coincide con cualquier dirección IP.
  • La cadena _default_, que es un alias para *

Entonces, con apache 2.4 la respuesta es, es lo mismo .

regilero
fuente