Apache: IP-based y Name-based virtual hosting

En el servidor web apache existen 2 formas de definir los sitios web que debe servir. Estamos hablando de IP-Based Virtual Hosting y de Name-based Virtual Hosting. Veamos en que consisten.

IP-Based Virtual Host

Es un método para referenciar un virtual host en apache, basado en indicar la dirección IP y puerto. De esta forma, apache sabrá que host debe atender a un sitio web en base a ello.

Se suele usar para servir diferentes sitios en puertos o interfaces diferentes. Asi, el servidor debe tener una combinación de ip y puerto únicas para cada IP-Based virtual host.

*Hosts que tengan la misma ip pero diferentes puertos, para apache también es IP-Based Virtual Hosting.

Esto fue durante un tiempo necesario usar en los sitios web que utilizaban certificados de seguridad SSL.

Así se definen estos virtual host

<VirtualHost direccion:puerto>
     ....directivas....
</VirtualHost>

Ejemplo

<VirtualHost 1.1.1.1:80>
    ServerAdmin webmaster@www.uno.com
    DocumentRoot "/www/vhosts/www"
    ServerName www.uno.com
    ErrorLog "/www/logs/www/error_log"
    CustomLog "/www/logs/www/access_log" combined
</VirtualHost>

Name-based Virtual Host

Este caso suele utilizarse mas a menudo ya que es el ideal para servir diferentes sitios web con una misma dirección ip, ya que están pensados para que apache sepa que vhost debe atender una petición por las directivas ServerName y ServerAlias.
Sin embargo su construcción es algo diferente en apache 2.2 que en apache 2.4

En apache 2.2

En apache 2.2 primeramente debes declarar dentro de la configuracion del main server la ip para la que vas a crear un name-based virtual host. La direccion Ip puede ser un wildcard (*) para indicar todas las direcciones ip del servidor.

NameVirtualHost direccionIP:puerto

Seguidamente los virtualhost que querramos que sean Name-based, se definirán usando esa misma dirección y puerto, siguiendo el esquema antes indicado para Ip-Based.

Ejemplo

NameVirtualHost *:80
NameVirtualHost 1.1.1.1:8080

<VirtualHost *:80>
directivas
</VirtualHost>

<VirtualHost 1.1.1.1:8080>
directivas
</VirtualHost>
En apache 2.4

En apache 2.4 no se utiliza la directiva NameVirtualHost. Simplemente, cuando haya al menos 2 virtual host definidos con la misma dirección ip y puerto, los entenderá que son Name-Based.

<VirtualHost 1.1.1.1:80>
directivas
</VirtualHost>

<VirtualHost 1.1.1.1:80>
directivas
</VirtualHost>

o bien

<VirtualHost *:80>
directivas
</VirtualHost>

<VirtualHost *:80>
directivas
</VirtualHost>

Comprobacion

Para comprobar si apache los está interpretando como Ip-Based o bien Name-Based, lo podemos hacer con el comando

httpd -t -D DUMP_VHOSTS

que en apache 2.2 tiene el alias

httpd -S