En las primeras versiones de HTTP (como muchos otros protocolos, ej. FTP) cada host virtual en un mismo servidor necesitaba una dirección IP distinta. En algunas plataformas esto puede limitar el número de hosts virtuales que se pueden ejecutar, por cuestiones relacionadas con la disponibilidad de direcciones IP los registradores (ARIN, RIPE, y APNIC) desaconsejan decididamente su uso.
El protocolo HTTP/1.1
, y una extensión muy común
del HTTP/1.0
, incluyen un método que permite al servidor
identificar a que nombre se accede. La versión de Apache 1.1 y posteriores
soportan esta solución, así como el viejo "una dirección
IP por nombre de servidor".
Las ventajas de usar el nuevo soporte de hosts virtuales basados en nombre son las siguientes: permite un número prácticamente ilimitado de servidores, fácil configuración y uso, y no requiere ningún software ni hardware adicional. La principal desventaja es que el cliente debe soportar esta parte del protocolo. La últimas versiones de la mayoría de los navegadores lo cumplen, pero todavía queda una pequeña cantidad de navegadores muy antiguos que no lo soportan. Esto puede causar problemas, aunque más adelante se apuntan posibles soluciones.
El uso de hosts virtuales es muy sencillo, y superficialmente se asemeja al
método antiguo. La diferencia más notable entre la configuración
de un host virtual basado en IP y uno basado en nombre es la directiva NameVirtualHost
,
que especifica que IP deberá usarse como destino de los hosts virtuales
basados en nombre.
Por ejemplo, suponga que tanto www.dominio.tld y www.otrodominio.tld apuntan a la dirección IP 111.22.33.44. Simplemente tiene que añadir al fichero de configuración (la mayoría de las veces algo parecido a httpd.conf o srm.conf)un código similar al que sigue:
NameVirtualHost 111.22.33.44 <VirtualHost 111.22.33.44> ServerName www.dominio.tld DocumentRoot /www/dominio </VirtualHost> <VirtualHost 111.22.33.44> ServerName www.otrodominio.tld DocumentRoot /www/otrodominio </VirtualHost>
Por supuesto, cualquier otra directiva puede (y debería) situarse en
la sección <VirtualHost>
. Para que funcione, sólo
se necesita asegurarse de que los nombres www.dominio.tld y www.otrodominio.tld
apuntan a la dirección IP 111.22.33.44.
Nota: Cuando se especifica una IP en una directiva NameVirtualHost
,
sólo se atenderán las peticiones a dicha IP cuando coincidan con
un host virtual de la lista de <VirtualHost>. El "servidor principal"
nunca será atendido desde la dirección IP especificada.
Si se empiezan a usar los hosts virtuales, se debe dejar de usar el "servidor
principal" como servidor independiente, en su lugar se debe usar sólo
para contener directivas comunes a todos los hosts virtuales. En otras palabras,
todos y cada uno de los servidores (hostname) que quiera mantener, deben tener
una sección <VirtualHost> .
En la versión de Apache 1.3.13 y posteriores, se puede especificar el
caracter comodín * como dirección IP en NameVirtualHost
,
ésta será la IP utilizada por los hosts virtuales que no tengan
directiva(s) más especificas. Esto es útil para configurar servidores
de los que no se conoce a priori la dirección IP, p.ejem. porque tenga
la dirección IP dinámica o porque es forma parte de un cluster
de carga distribuida en al que todas las máquinas comparte el mismo fichero
de configuración.
Además de lo dicho, muchos servidores pueden desear que se acceda a
ellos por más de un nombre. Por ejemplo, el servidor anterior puede querer
ser accesible tanto como domino.tld
, como www2.dominio.tld
,
asumiendo que ambas direcciones IP apuntan al mismo servidor. De hecho, se puede
desear que todos nombres tipo dominio.tld
sean atendidos por el
servidor. Esto puede hacerse mediante la directiva ServerAlias
puesta dentro una sección <VirtualHost>. Por ejemplo:
ServerAlias dominio.tld *.dominio.tld
Observe que se pueden usar *
y ?
como caracteres
comodín.
También puede necesitar ServerAlias
si los usuarios de
su servidor local no siempre incluyen el nombre del dominio. Por ejemplo, si
los usuarios locales están acostumbrados a escribir "www" o
"www.foobar" en lugar del dominio completo "www.foobar.tld",
entonces necesitará añadir ServerAlias www www.foobar
.
El servidor no puede saber que dominio utilizan los clientes para la resolución
de nombres, porque el cliente no proporciona esta información en la petición.
Generalmente, la directiva ServerAlias
es un modo de permitir que
distintos nombres de servidor apunten al mismo host virtual.
Como se ha mencionado antes, todavía se usan algunos programas clientes que no envían los datos necesarios para que los hosts virtuales basados en nombre funcionen correctamente. Estos clientes siempre recibirán las páginas del primer host virtual de la lista para dicha IP (el host virtual primario basado en nombre).
Hay una posible solución con la directiva ServerPath
,
si bien es cierto que un poco pesada.
Ejemplo de configuración
NameVirtualHost 111.22.33.44 <VirtualHost 111.22.33.44> ServerName www.dominio.tld ServerPath /dominio DocumentRoot /web/dominio </VirtualHost>
¿Que es lo que significa? Significa que cualquier petición a
una URI que comience con "/dominio" será atendida desde
el host virtual www.dominio.tld. Esto quiere decir que se puede
acceder a http://www.dominio.tld/dominio/
desde cualquier cliente,
también podrán acceder aunque manden un Host: header
http://www.dominio.tld/
.
Para que esto funcione, ponga un enlace en la página principal del host virtual a http://www.dominio.tld/dominio/. Después asegúrese de que en todas las páginas usan enlaces relativos (p.ejem. "fichero.html" o "../iconos/imagen.gif") o enlaces precedidos por /dominio/ (p.ejem. "http://www.dominio.tld/dominio/misc/fichero.html" o "/dominio/misc/fichero.html").
Esto requiere un poco de disciplina, pero seguir estas normas garantiza que nuestras páginas serán visibles en todos los navegadores, viejos y nuevos.
Vea también: Ejemplo de configuración de ServerPath