Este documento intenta responder las preguntas más frecuentes sobre la configuración de hosts virtuales. Estos escenarios son aquellos que involucran varios sitios web que se ejecutan en un solo servidor, a través de hosts virtuales basados ​​en nombres o basados ​​en IP.

Ejecución de varios sitios web basados ​​en nombres en una única dirección IP.

Su servidor tiene varios nombres de host que se resuelven en una sola dirección y desea responder de manera diferente www.example.com y www.example.org.

Nota

La creación de configuraciones de host virtual en su servidor Apache no causa mágicamente que se creen entradas DNS para esos nombres de host. usted debe tenga los nombres en DNS, resueltos a su dirección IP, o nadie más podrá ver su sitio web. Puede poner entradas en su hosts archivo para pruebas locales, pero eso funcionará solo desde la máquina con esos hosts entradas.

# Ensure that Apache listens on port 80
Listen 80

    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here



    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here

Los asteriscos coinciden con todas las direcciones, por lo que el servidor principal no atiende solicitudes. Debido al hecho de que el host virtual con ServerName www.example.com es el primero en el archivo de configuración, tiene la prioridad más alta y puede verse como el defecto o primario servidor. Eso significa que si se recibe una solicitud que no coincide con uno de los especificados ServerName directivas, será servido por este primer .

La configuración anterior es la que querrá utilizar en casi todas las situaciones de alojamiento virtual basado en nombres. De hecho, lo único para lo que esta configuración no funcionará es cuando esté sirviendo contenido diferente basado en diferentes direcciones IP o puertos.

Nota

Puedes reemplazar * con una dirección IP específica en el sistema. Dichos hosts virtuales solo se utilizarán para solicitudes HTTP recibidas al conectarse a la dirección IP especificada.

Sin embargo, también es útil utilizar * en sistemas donde la dirección IP no es predecible, por ejemplo, si tiene una dirección IP dinámica con su ISP y está utilizando alguna variedad de solución de DNS dinámico. Ya que * coincide con cualquier dirección IP, esta configuración funcionará sin cambios siempre que cambie su dirección IP.

Hosts basados ​​en nombres en más de una dirección IP.

Nota

Cualquiera de las técnicas discutidas aquí se puede extender a cualquier número de direcciones IP.

El servidor tiene dos direcciones IP. En uno (172.20.30.40), serviremos al servidor “principal”, server.example.com y por el otro172.20.30.50), daremos servicio a dos o más hosts virtuales.

Listen 80

# This is the "main" server running on 172.20.30.40
ServerName server.example.com
DocumentRoot "/www/mainserver"


    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here ...



    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here ...

Cualquier solicitud a una dirección que no sea 172.20.30.50 será servido desde el servidor principal. Una solicitud para 172.20.30.50 con un nombre de host desconocido, o sin Host: encabezado, se servirá desde www.example.com.

Sirviendo el mismo contenido en diferentes direcciones IP (como una dirección interna y externa).

La máquina servidor tiene dos direcciones IP (192.168.1.1 y 172.20.30.40). La máquina está ubicada entre una red interna (intranet) y una red externa (Internet). Fuera de la red, el nombre server.example.com resuelve en la dirección externa (172.20.30.40), pero dentro de la red, ese mismo nombre se resuelve en la dirección interna (192.168.1.1).

Se puede hacer que el servidor responda a solicitudes internas y externas con el mismo contenido, con solo una sección.


    DocumentRoot "/www/server1"
    ServerName server.example.com
    ServerAlias server

Ahora las solicitudes de ambas redes se atenderán desde la misma .

Nota:

En la red interna, solo se puede usar el nombre server en lugar del nombre de host completo server.example.com.

Tenga en cuenta también que, en el ejemplo anterior, puede reemplazar la lista de direcciones IP con *, lo que hará que el servidor responda de la misma manera en todas las direcciones.

Ejecutando diferentes sitios en diferentes puertos.

Tiene varios dominios que van a la misma IP y también quiere servir a varios puertos. El siguiente ejemplo ilustra que la coincidencia de nombres tiene lugar después de que se determina la mejor combinación de dirección IP y puerto.

Listen 80
Listen 8080


    ServerName www.example.com
    DocumentRoot "/www/domain-80"



    ServerName www.example.com
    DocumentRoot "/www/domain-8080"



    ServerName www.example.org
    DocumentRoot "/www/otherdomain-80"



    ServerName www.example.org
    DocumentRoot "/www/otherdomain-8080"

Alojamiento virtual basado en IP

El servidor tiene dos direcciones IP (172.20.30.40 y 172.20.30.50) que resuelven los nombres www.example.com y www.example.org respectivamente.

Listen 80


    DocumentRoot "/www/example1"
    ServerName www.example.com



    DocumentRoot "/www/example2"
    ServerName www.example.org

Solicitudes de cualquier dirección no especificada en uno de los directivas (como localhost, por ejemplo) irá al servidor principal, si hay uno.

Hosts virtuales mixtos basados ​​en puerto y basados ​​en ip

La máquina servidor tiene dos direcciones IP (172.20.30.40 y 172.20.30.50) que resuelven los nombres www.example.com y www.example.org respectivamente. En cada caso, queremos ejecutar hosts en los puertos 80 y 8080.

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080


    DocumentRoot "/www/example1-80"
    ServerName www.example.com



    DocumentRoot "/www/example1-8080"
    ServerName www.example.com



    DocumentRoot "/www/example2-80"
    ServerName www.example.org



    DocumentRoot "/www/example2-8080"
    ServerName www.example.org

Vhosts mixtos basados ​​en nombres y basados ​​en IP

Cualquier dirección mencionada en el argumento de un host virtual que nunca aparece en otro host virtual es un host virtual estrictamente basado en IP.

Listen 80

    DocumentRoot "/www/example1"
    ServerName www.example.com



    DocumentRoot "/www/example2"
    ServerName www.example.org



    DocumentRoot "/www/example3"
    ServerName www.example.net


# IP-based

    DocumentRoot "/www/example4"
    ServerName www.example.edu



    DocumentRoot "/www/example5"
    ServerName www.example.gov

Utilizando Virtual_host y mod_proxy juntos

El siguiente ejemplo permite que una máquina de front-end haga proxy de un host virtual a través de un servidor que se ejecuta en otra máquina. En el ejemplo, un host virtual del mismo nombre está configurado en una máquina en 192.168.111.2. los ProxyPreserveHost On La directiva se utiliza para que se pase el nombre de host deseado, en caso de que estemos enviando varios nombres de host a una sola máquina.


    ProxyPreserveHost On
    ProxyPass        "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com

Utilizando _default_ vhosts

_default_ vhosts para todos los puertos

Atrapando cada solicitud a cualquier dirección IP y puerto no especificados, es decir, una combinación de dirección / puerto que no se utiliza para ningún otro host virtual.


    DocumentRoot "/www/default"

El uso de un vhost predeterminado con un puerto comodín evita eficazmente que cualquier solicitud vaya al servidor principal.

Un vhost predeterminado nunca atiende una solicitud que se envió a una dirección / puerto que se utiliza para vhosts basados ​​en nombres. Si la solicitud contenía un desconocido o no Host: encabezado siempre se sirve desde el vhost primario basado en el nombre (el vhost para esa dirección / puerto aparece primero en el archivo de configuración).

Puedes usar AliasMatch o RewriteRule para reescribir cualquier solicitud en una sola página de información (o script).

_default_ vhosts para diferentes puertos

Igual que la configuración 1, pero el servidor escucha en varios puertos y queremos usar un segundo _default_ vhost para el puerto 80.


    DocumentRoot "/www/default80"
    # ...



    DocumentRoot "/www/default"
    # ...

El vhost predeterminado para el puerto 80 (que debe aparecen antes de cualquier vhost predeterminado con un puerto comodín) captura todas las solicitudes que se enviaron a una dirección IP no especificada. El servidor principal nunca se utiliza para atender una solicitud.

_default_ vhosts para un puerto

Queremos tener un vhost predeterminado para el puerto 80, pero no otros vhosts predeterminados.


    DocumentRoot "/www/default"
...

Una solicitud a una dirección no especificada en el puerto 80 se atiende desde el vhost predeterminado. Cualquier otra solicitud a una dirección y puerto no especificados se atiende desde el servidor principal.

Cualquier uso de * en una declaración de host virtual tendrá mayor precedencia que _default_.

Migrar un vhost basado en nombre a un vhost basado en IP

El vhost basado en nombre con el nombre de host www.example.org (de nuestro ejemplo basado en nombre, configuración 2) debería obtener su propia dirección IP. Para evitar problemas con los servidores de nombres o proxies que almacenaron en caché la dirección IP anterior para el vhost basado en nombres, queremos proporcionar ambas variantes durante una fase de migración.

La solución es fácil, porque simplemente podemos agregar la nueva dirección IP (172.20.30.50) al VirtualHost directiva.

Listen 80
ServerName www.example.com
DocumentRoot "/www/example1"


    DocumentRoot "/www/example2"
    ServerName www.example.org
    # ...



    DocumentRoot "/www/example3"
    ServerName www.example.net
    ServerAlias *.example.net
    # ...

Ahora se puede acceder al vhost a través de la nueva dirección (como un vhost basado en IP) y a través de la dirección anterior (como un vhost basado en el nombre).

Utilizando el ServerPath directiva

Tenemos un servidor con dos vhosts basados ​​en nombres. Para hacer coincidir el host virtual correcto, un cliente debe enviar el Host: encabezamiento. Los antiguos clientes HTTP / 1.0 no envían dicho encabezado y Apache no tiene ni idea de qué vhost intentó alcanzar el cliente (y atiende la solicitud desde el vhost principal). Para proporcionar la mayor compatibilidad con versiones anteriores posible, creamos un vhost principal que devuelve una sola página que contiene enlaces con una URL. prefix a los hosts virtuales basados ​​en nombres.


    # primary vhost
    DocumentRoot "/www/subdomain"
    RewriteEngine On
    RewriteRule "." "/www/subdomain/index.html"
    # ...



    DocumentRoot "/www/subdomain/sub1"
    ServerName www.sub1.domain.tld
    ServerPath "/sub1/"
    RewriteEngine On
    RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
    # ...



    DocumentRoot "/www/subdomain/sub2"
    ServerName www.sub2.domain.tld
    ServerPath "/sub2/"
    RewriteEngine On
    RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
    # ...

Debido a la ServerPath dirigir una solicitud a la URL http://www.sub1.domain.tld/sub1/ es siempre servido desde el sub1-vhost.
Una solicitud a la URL http://www.sub1.domain.tld/ solo se sirve desde el sub1-vhost si el cliente envió un Host: encabezamiento. Si no Host: Se envía el encabezado, el cliente obtiene la página de información del host principal.

Tenga en cuenta que hay una rareza: una solicitud para http://www.sub2.domain.tld/sub1/ también se sirve desde el sub1-vhost si el cliente no envió Host: encabezamiento.

los RewriteRule Las directivas se utilizan para asegurarse de que un cliente que envió un Host: El encabezado puede usar ambas variantes de URL, es decir, con o sin URL prefix.