Me gustaría configurar un entorno donde los hosts virtuales de Apache se puedan crear dinámicamente sin volver a cargar la configuración.
Puedo hacer esto con mod_vhost_alias , configuré mi host virtual predeterminado algo como esto
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Eso funciona bien, pero si se solicita un nombre de host que no está configurado actualmente, aparece un error 404 No encontrado.
Lo que realmente me gustaría hacer es hacer que este VirtualHost se active solo si existe la raíz del documento, de lo contrario, intente que coincida con otro vhost (en otras palabras, haga que la presencia de VirtualDocumentRoot funcione de la misma manera que usar un ServerAlias)
Intenté hacer de este el segundo vhost, con el primer vhost solo manejando todas las solicitudes, pero esto no funcionó: las solicitudes de dominios donde se configuró un VirtualDocumentRoot estaban cayendo al vhost predeterminado.
Entonces, ¿cómo puedo tener vhosts configurados dinámicamente, pero con una alternativa a otro vhost para cualquiera que aún no esté configurado?
fuente

Encontré tu pregunta cuando busqué en Google. Tuve exactamente el mismo problema y apliqué la solución como se describe en la respuesta de Paul . Sin embargo, para mi aplicación web compleja, no estaba contento con enrutar todas las solicitudes a través de una sola
notfound.php.Al final, logré solucionar el problema sin scripts externos, solo editando mi configuración VirtualHost.
Al principio, mi VirtualHost se configuró así:
Tenía URL como
client1.domainname.com,client2.domainname.comywhatever.domainname.comque resolvieron
/mnt/ramdisk/www/cms-client1-development/,/mnt/ramdisk/www/cms-client2-development/y/mnt/ramdisk/www/cms-whatever-development/Sin embargo, una URL como
nonexistent.domainname.comme daría un 404 porque el directorio/mnt/ramdisk/www/cms-nonexistent-development/no existía. Quería que estos subdominios usaran el directorio/mnt/ramdisk/www/cms-default-development/Lo arreglé usando
ModRewriteyModProxy:Lo que esto hace es: tomar el subdominio (la parte anterior
.domainname.com), insertarlo en la ruta (% 1) y las solicitudes de proxy a la URL predeterminada solo si el directorio no existe.Al usar un proxy, el proceso es transparente y el usuario cree que está visitando http://nonexistent.domainname.com , mientras que en realidad ve el contenido de http://default.domainname.com/ .
fuente
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
foo.comdebe servir el mismo contenido quewww.foo.comfoo.comawww.foo.commenos que nowwwesté disponible, en su lugar recurra a la predeterminadaDNS
Tengo un par de dominios (y todos sus subdominios) apuntando a mi VPS, por ejemplo:
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:
Pruebas
Traduciendo mis objetivos en casos comprobables:
La solución
Esto utiliza: y
mod_rewrite, pormod_proxy_httpsupuestomod_vhost_alias.¿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 eldomain.com/subcomo eldomain.com/wwwdirectorio directorio no están presentes.El tercer
RewriteRuleproxy dedomain.comcuándodomain.com/subno existe. Sabemosdomain.com/wwwque existe debido al segundo bloque de reescritura.dominio desnudo
El vhost bare.domain está tomando el
*.*solicitudes y las atiende/domain.com/wwwAquí el
RewriteRuleproxy a localhost cuandodomain.comodomain.com/wwwno existe.^ $%. * !!!
Tuve algunos problemas para envolver mi cabeza alrededor de todos aquellos
$y%signos en elRewriteCondyRewriteRulepor lo que voy a explicar acerca de ellos aquí:*en elServerAliasson solo comodines.%nelVirtualDocumentRootson de la interpolación del nombre del documento .%nel segundo seRewriteCondrefieren a las selecciones(.*)del primeroRewriteCond, por ejemplo. Las partes del dominio solicitado.%nen elRewriteRulehacer también.$1en seRewriteRulerefiere a la selección(.*)al comienzo deRewriteRule. Que captura todo, desde el dominio hasta la?URL de la solicitud. Cualquier cadena de consulta se agrega automáticamente a la url pormod_proxy.fuente
Simplemente arrojándolo, obtengo el mismo resultado (menos la redirección localhost) que RemyNL, pero también incluye la dirección IP cuando me conecto directamente:
fuente