<-
Apache > Servidor HTTP > Documentación > Versión 2.5 > Rewrite

Hosts virtuales masivos dinámicos con mod_rewrite

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Este documento complementa la mod_rewrite documentación de referencia. Describe cómo puede usar mod_rewrite para crear hosts virtuales configurados dinámicamente.

mod_rewrite generalmente no es la mejor forma de configurar hosts virtuales. Debería considerar primero las alternativas antes de recurrir a mod_rewrite. Vea también el documento "cómo evitar mod_rewrite".

Consulte también

top

Hosts Virtuales para Nombres de Host Arbitrarios

Descripción:

Queremos crear automáticamente un host virtual para cada nombre de host que resuelva en nuestro dominio, sin tener que crear nuevas secciones VirtualHost.

En esta receta, asumimos que usaremos el nombre de host SITIO.example.com para cada usuario, y serviremos su contenido desde /home/SITIO/www. Sin embargo, queremos que www.example.com sea omitido de este mapeo.

Solución:
RewriteEngine on

RewriteMap    lowercase int:tolower

RewriteCond   %{HTTP_HOST} !^www\.
RewriteCond   ${lowercase:%{HTTP_HOST}}   ^([^.]+)\.example\.com$
RewriteRule   ^(.*)    /home/%1/www$1
Discusión
Necesitará encargarse de la resolución DNS - Apache no maneja la resolución de nombres. Necesitará crear registros CNAME para cada nombre de host, o un registro DNS comodín. La creación de registros DNS está fuera del alcance de este documento.

La directiva interna tolower de RewriteMap se usa para asegurar que los nombres de host que se usen estén todos en minúsculas, de modo que no haya ambigüedad en la estructura de directorios que debe crearse.

Los paréntesis usados en una RewriteCond se capturan en las referencias inversas %1, %2, etc, mientras que los paréntesis usados en RewriteRule se capturan en las referencias inversas $1, $2, etc.

La primera RewriteCond verifica si el nombre de host comienza con www., y si es así, la reescritura se omite.

Como con muchas técnicas discutidas en este documento, mod_rewrite realmente no es la mejor forma de lograr esta tarea. Debería, en su lugar, considerar usar mod_vhost_alias, ya que manejará mucho más elegantemente cualquier cosa más allá de servir archivos estáticos, como cualquier contenido dinámico, y resolución de Alias.

top

Hosts Virtuales Dinámicos Usando mod_rewrite

Este extracto de httpd.conf hace lo mismo que el primer ejemplo. La primera mitad es muy similar a la parte correspondiente anterior, excepto por algunos cambios, necesarios para compatibilidad hacia atrás y para hacer que la parte de mod_rewrite funcione correctamente; la segunda mitad configura mod_rewrite para hacer el trabajo real.

Debido a que mod_rewrite se ejecuta antes que otros módulos de traducción de URI (por ejemplo, mod_alias), se le debe decir a mod_rewrite que ignore explícitamente cualquier URL que hubiera sido manejada por esos módulos. Y, debido a que estas reglas de lo contrario evitarían cualquier directiva ScriptAlias, debemos hacer que mod_rewrite ejecute explícitamente esos mapeos.

# get the server name from the Host: header
UseCanonicalName Off

# splittable logs
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

<Directory "/www/hosts">
    # ExecCGI is needed here because we can't force
    # CGI execution in the way that ScriptAlias does
    Options FollowSymLinks ExecCGI
</Directory>

RewriteEngine On

# a ServerName derived from a Host: header may be any case at all
RewriteMap  lowercase  "int:tolower"

## deal with normal documents first:
# allow Alias /icons/ to work - repeat for other aliases
RewriteCond  "%{REQUEST_URI}"  "!^/icons/"
# allow CGIs to work
RewriteCond  "%{REQUEST_URI}"  "!^/cgi-bin/"
# do the magic
RewriteRule  "^/(.*)$"         "/www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1"

## and now deal with CGIs - we have to force a handler
RewriteCond  "%{REQUEST_URI}"  "^/cgi-bin/"
RewriteRule  "^/(.*)$"         "/www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1"  [H=cgi-script]
top

Usando un Archivo de Configuración de Host Virtual Separado

Este arreglo usa características más avanzadas de mod_rewrite para determinar la traducción de host virtual a raíz de documento, desde un archivo de configuración separado. Esto proporciona más flexibilidad, pero requiere una configuración más complicada.

El archivo vhost.map debería verse algo como esto:

customer-1.example.com /www/customers/1
customer-2.example.com /www/customers/2
# ...
customer-N.example.com /www/customers/N

El httpd.conf debería contener lo siguiente:

RewriteEngine on

RewriteMap   lowercase  "int:tolower"

# define the map file
RewriteMap   vhost      "txt:/www/conf/vhost.map"

# deal with aliases as above
RewriteCond  "%{REQUEST_URI}"               "!^/icons/"
RewriteCond  "%{REQUEST_URI}"               "!^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
# this does the file-based remap
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/(.*)$"                      "%1/docs/$1"

RewriteCond  "%{REQUEST_URI}"               "^/cgi-bin/"
RewriteCond  "${lowercase:%{SERVER_NAME}}"  "^(.+)$"
RewriteCond  "${vhost:%1}"                  "^(/.*)$"
RewriteRule  "^/cgi-bin/(.*)$"                      "%1/cgi-bin/$1" [H=cgi-script]

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn