También me encontré con esta pregunta buscando en Google apache2 Dynamic Vhost Fallback y la respuesta de Luc me ayudó mucho a resolver mi problema, pero todavía quiero mostrar lo que hice para lograr mis objetivos, principalmente porque implicó algunos trabajos adicionales y porque creo que podría ser útil para cualquier futuro googlers ...
Mis metas
- Vhosting dinámico para todos los dominios y subdominios que apuntan a mi VPS
foo.com debe servir el mismo contenido que www.foo.com
- reserva para dominios desconocidos a algún tipo de defecto
- reserva para subdominios desconocidos de
foo.coma www.foo.commenos que no wwwesté disponible, en su lugar recurra a la predeterminada
DNS
Tengo un par de dominios (y todos sus subdominios) apuntando a mi VPS, por ejemplo:
- foo.com
- bar.com
- foobar.com
Sistema de archivos
Tengo los siguientes directorios, los dominios contienen directorios con los nombres de los subdominios disponibles, se requiere el directorio www, pero la configuración debería ser capaz de lidiar con la situación en la que no está presente. Localhost se utiliza como reserva predeterminada:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Pruebas
Traduciendo mis objetivos en casos comprobables:
- foo.com debe ser servido desde foo.com/www
- www.foo.com debe ser servido desde foo.com/www
- bar.foo.com debe servirse desde foo.com/bar
- foo.foo.com debe ser servido desde foo.com/www (foo.com/foo no existe)
- bar.com debe servirse desde localhost (bar.com/www no existe)
- www.bar.com debe ser servido desde localhost (bar.com/www no existe)
- foo.bar.com debe ser servido desde bar.com/foo
- bar.bar.com debe servirse desde localhost (bar.com/bar no existe)
- foobar.com debe ser servido desde localhost (foobar.com no existe)
- www.foobar.com debe ser servido desde localhost (foobar.com no existe)
- foo.foobar.com debe ser servido desde localhost (foobar.com no existe)
La solución
Esto utiliza: y mod_rewrite, por mod_proxy_httpsupuesto mod_vhost_alias.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
¿Como funciona esto? Hay tres hosts virtuales definidos:
localhost
El localhost sirve como predeterminado. Todas las solicitudes que no se pueden resolver son atendidas por localhost. Configurar un enlace simbólico desde localhost a cualquiera de sus dominios es como configurar ese sitio como predeterminado.
subdominio
El subdominio vhost está tomando todas las solicitudes en forma de *.*.*. Por defecto, todas las solicitudes se atienden /domain.com/subsegún lo definido porVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3 .
retroceder:
El primero RewriteRulese ocupa de dominios desconocidos, por ejemplo.domain.comel directorio no existe, mediante la representación del sitio web localhost.
El segundo RewriteRuletambién representa a localhost cuando tanto el domain.com/subcomo eldomain.com/www directorio directorio no están presentes.
El tercer RewriteRuleproxy de domain.comcuándo domain.com/subno existe. Sabemos domain.com/wwwque existe debido al segundo bloque de reescritura.
dominio desnudo
El vhost bare.domain está tomando el *.* solicitudes y las atiende/domain.com/www
Aquí el RewriteRuleproxy a localhost cuando domain.como domain.com/wwwno existe.
^ $%. * !!!
Tuve algunos problemas para envolver mi cabeza alrededor de todos aquellos $y %signos en el RewriteCondy RewriteRulepor lo que voy a explicar acerca de ellos aquí:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- El
*en elServerAlias son solo comodines.
- En
%nel VirtualDocumentRootson de la interpolación del nombre del documento .
- En
%nel segundo se RewriteCondrefieren a las selecciones (.*)del primeroRewriteCond , por ejemplo. Las partes del dominio solicitado.
- El
%nen elRewriteRule hacer también.
- El
$1en se RewriteRulerefiere a la selección (.*)al comienzo de RewriteRule. Que captura todo, desde el dominio hasta la ?URL de la solicitud. Cualquier cadena de consulta se agrega automáticamente a la url por mod_proxy.