Apache: Virtual Host Matching

Esta es una de las grandes dudas que siempre aparecen a la hora de empezar a trabajar con apache. ¿que reglas sigue para saber qué virtual host servirá una u otra petición?

Vamos a intentar aclararlo.

Conceptos base

Para empezar, antes deberemos tener claros algunos conceptos.

Cuando un navegador o cliente web hace una petición http o https a un servidor web, entre otras cosas le indica estos 3 datos:

  • La dirección ip de la pagina web que desea ver
  • El puerto de la misma
  • El host header o encabezado del host

Este encabezado no es mas que la pagina que quieres ver, por ejemplo www.dominio.com o tienda.otrodominio.com

El Matching de apache

Cuando una petición llega al servidor, lo primero que buscara apache es una coincidencia exacta de Ip y puerto en su listado de virtual hosts.

Por ejemplo

<VirtualHost  1.1.1.1:80>
....
</VirtualHost>

Si no la encuentra, buscara coincidencias teniendo en cuenta el wildcard (*) en la definicion del virtualhost.

Por ejemplo

<VirtualHost *:80>
....
</VirtualHost>`
Si no encuentra ninguna coincidencia

Si ninguno de sus virtual host lo satisfacen, mandara la petición al main server o, si existe, al definido con el wildcard _default_, que actuará de "catch all".

Por ejemplo

<VirtualHost _default_:80>
DocumentRoot /www/default80
 ...
</VirtualHost>
Si encuentra coincidencias
  • Si encuentra la coincidencia en un solo vhost, la respuesta es facil. Ese sera el que sirva la petición.

  • Si encuentra varios vhost con esa combinación de ip y puerto o wildcard/puerto, asumirá que es un Name-based virtual hosting, asi que buscara el encabezado del host de la petición en las directivas ServerName y ServerAlias de esos vhost.

  • Si entre ellos no encuentra ningún vhost que lo cumpla será el primero de ellos el que se usará, tambien llamado sitio web "default" de un Name-Based virtual hosting.

Recomendaciones

De todo esto podemos sacar varias recomendaciones:

  • Por ejemplo, que deberíamos tener uno o varios vhost con el wildcard _default_ que atiendan a todo lo que nuestros sitios web no atienden, para un mayor control sobre ello.
    Hay tener claro que este vhost no responderá a peticiones que satisfagan otros Name-based vhosts.

  • También que deberíamos asegurarnos que tenemos un default vhost para cada Name-Based virtual host, por ejemplo, definidos en el mismo httpd.conf, para asi asegurarnos que son los primeros a la hora de parsear la configuración. El resto de virtual host podrían ir configurados en un directorio aparte.