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.