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.com
ywhatever.domainname.com
que 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.com
me 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
ModRewrite
yModProxy
: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.com
debe servir el mismo contenido quewww.foo.com
foo.com
awww.foo.com
menos que nowww
esté 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_http
supuestomod_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/sub
según lo definido porVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.retroceder:
El primero
RewriteRule
se ocupa de dominios desconocidos, por ejemplo.domain.com
el directorio no existe, mediante la representación del sitio web localhost.El segundo
RewriteRule
también representa a localhost cuando tanto eldomain.com/sub
como eldomain.com/www
directorio directorio no están presentes.El tercer
RewriteRule
proxy dedomain.com
cuándodomain.com/sub
no existe. Sabemosdomain.com/www
que 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
RewriteRule
proxy a localhost cuandodomain.com
odomain.com/www
no existe.^ $%. * !!!
Tuve algunos problemas para envolver mi cabeza alrededor de todos aquellos
$
y%
signos en elRewriteCond
yRewriteRule
por lo que voy a explicar acerca de ellos aquí:*
en elServerAlias
son solo comodines.%n
elVirtualDocumentRoot
son de la interpolación del nombre del documento .%n
el segundo seRewriteCond
refieren a las selecciones(.*)
del primeroRewriteCond
, por ejemplo. Las partes del dominio solicitado.%n
en elRewriteRule
hacer también.$1
en seRewriteRule
refiere 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