Versión 2.5 del Servidor HTTP Apache

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".
Hosts Virtuales para Nombres de Host Arbitrarios
Hosts Virtuales
Dinámicos Usando mod_rewrite
Usando un Archivo de Configuración de Host Virtual SeparadoQueremos 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.
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond ${lowercase:%{HTTP_HOST}} ^([^.]+)\.example\.com$
RewriteRule ^(.*) /home/%1/www$1
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.
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]
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]