Eu gostaria de configurar um ambiente em que os hosts virtuais do Apache possam ser criados dinamicamente sem recarregar a configuração.
Eu posso fazer isso com mod_vhost_alias , configurei meu host virtual padrão algo como isto
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Isso funciona muito bem, mas se uma solicitação for feita para um nome de host que não está configurado no momento, eu recebo um erro 404 Não encontrado.
O que eu realmente gostaria de fazer é ter esse chute do VirtualHost apenas se a raiz do documento existir, caso contrário, tente corresponder a outro vhost (em outras palavras, faça com que a presença do VirtualDocumentRoot funcione da mesma maneira que o uso de um ServerAlias)
Tentei fazer deste o segundo vhost, com o primeiro vhost apenas manipulando todas as solicitações, mas isso não funcionou - as solicitações de domínios em que um VirtualDocumentRoot foi configurado estavam caindo no vhost padrão.
Então, como posso configurar vhosts dinamicamente, mas com um fallback para outro vhost para qualquer um que ainda não esteja configurado?
fonte
Encontrei sua pergunta no Google. Eu tive exatamente o mesmo problema e apliquei a correção conforme descrito na resposta de Paulo . No entanto, para meu aplicativo Web complexo, eu não estava feliz com o roteamento de todas as solicitações através de uma única
notfound.php
.No final, consegui corrigir o problema sem scripts externos, apenas editando minha configuração do VirtualHost.
Inicialmente, meu VirtualHost foi configurado assim:
Eu tinha URLs gosto
client1.domainname.com
,client2.domainname.com
ewhatever.domainname.com
que resolveu
/mnt/ramdisk/www/cms-client1-development/
,/mnt/ramdisk/www/cms-client2-development/
e/mnt/ramdisk/www/cms-whatever-development/
No entanto, uma URL como
nonexistent.domainname.com
me daria um 404 porque o diretório/mnt/ramdisk/www/cms-nonexistent-development/
não existia. Eu queria que esses subdomínios usassem o diretório/mnt/ramdisk/www/cms-default-development/
Corrigi isso usando
ModRewrite
eModProxy
:O que isso faz é: pegue o subdomínio (a parte anterior
.domainname.com
), insira-o no caminho (o% 1) e solicite proxy ao URL padrão apenas se o diretório não existir.Ao usar um proxy, o processo é transparente e o usuário pensa que está visitando http://nonexistent.domainname.com , enquanto ele realmente visualiza o conteúdo em http://default.domainname.com/ .
fonte
Eu também me deparei com essa pergunta pesquisando no Google sobre apache2 dynamic vhost fallback e a resposta de Luc me ajudou muito na solução do meu problema, mas ainda quero mostrar o que fiz para alcançar meus objetivos, principalmente porque envolveu alguns trabalhos extras e porque acho que pode ser útil para futuros googlers ...
Os meus objetivos
foo.com
deve veicular o mesmo conteúdo quewww.foo.com
foo.com
awww.foo.com
, a menos que nãowww
esteja disponível, fallback para o padrãoDNS
Eu tenho alguns domínios (e todos os seus subdomínios) apontando para o meu VPS, por exemplo:
Sistema de arquivo
Eu tenho os seguintes diretórios, os domínios contêm diretórios com os nomes dos subdomínios disponíveis, o diretório www é necessário, mas a configuração deve ser capaz de lidar com a situação em que não está presente. Localhost é usado como fallback padrão:
Testes
Traduzindo meus objetivos em casos testáveis:
A solução
Isto usa:
mod_rewrite
,mod_proxy_http
e é claromod_vhost_alias
.Como é que isso funciona? Existem três hosts virtuais definidos:
localhost
O host local serve como padrão. Todas as solicitações que não são resolvíveis são atendidas pelo host local. A configuração de um link simbólico do host local para qualquer um dos seus domínios é como configurar o site como padrão.
sub.domínio
O sub.domain vhost está recebendo todas as solicitações no formato de
*.*.*
. Por padrão, todas as solicitações são atendidas/domain.com/sub
conforme definido porVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.cair pra trás:
O primeiro
RewriteRule
cuida de domínios desconhecidos, por exemplo.domain.com
O diretório não existe, fazendo proxy do site localhost.O segundo
RewriteRule
também procura proxies para o host local quandodomain.com/sub
osdomain.com/www
diretórios e os não estão presentes.Os terceiros
RewriteRule
proxies paradomain.com
quandodomain.com/sub
não existe. Sabemosdomain.com/www
que existe por causa do segundo bloco de reescrita.bare.domain
O vhost bare.domain está recebendo as
*.*
solicitações e as atende/domain.com/www
Aqui, o
RewriteRule
proxy procurará o host local quandodomain.com
oudomain.com/www
não existir.^ $%. * !!!
Eu tive alguns problemas envolvendo minha cabeça em torno de todos aqueles
$
e%
sinais noRewriteCond
eRewriteRule
por isso vou explicar sobre eles aqui:*
noServerAlias
são apenas curingas.%n
noVirtualDocumentRoot
são do nome do documento de interpolação .%n
segundoRewriteCond
refere-se às seleções(.*)
do primeiroRewriteCond
, por exemplo. as partes do domínio solicitado.%n
noRewriteRule
fazer também.$1
noRewriteRule
refere-se à seleção(.*)
no início doRewriteRule
. Que captura tudo, desde o domínio até o?
URL da solicitação. Qualquer string de consulta é automaticamente adicionada ao URL pormod_proxy
.fonte
Apenas lançando-o por aí, recebo o mesmo resultado (menos o redirecionamento de host local) que o RemyNL, mas também incluindo o endereço IP ao conectar diretamente:
fonte