Soporte Apache de hosts virtuales basados en nombre

Vea también: Soporte Apache de hosts virtuales basados en IP

Hosts virtuales basados en nombre frente a basados en IP

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 sin-IP

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.

Compatibilidad con navegadores antiguos.

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