Apenas use links simbólicos para todos os arquivos e diretórios na pasta raiz do site.
Eu tenho dois sites, websitea e websiteb.
Eu tenho os dois apontando para a mesma raiz do documento e tudo funciona bem, no entanto, quero que o websitea tenha detalhes diferentes do db para o websiteb.
Detalhes do banco de dados são armazenados em /config/database.php
Eu poderia apenas escrever uma declaração if nesse arquivo php para dizer quais detalhes do banco de dados usar dependendo do nome do host, no entanto eu vou adicionar outros 10 sites como este, e isso vai para ter uma dor muito rápida.
O segundo problema é que eu tenho uma pasta chamada / images / que contém fotos enviadas pelo usuário, que precisam ser diferentes novamente.
Quando eu comecei a pensar sobre isso, eu pensei que poderia usar o apelido do apaches - no entanto, isso não vai funcionar com o php, como fazer
<?php include('config/database.php');?>
não seguirá o alias (não é uma solicitação da web, é uma pesquisa dir local) e, portanto, falhará.
Então estou um pouco preso:)
Alguém tem alguma ideia?
Apenas use links simbólicos para todos os arquivos e diretórios na pasta raiz do site.
Eu tenho algumas soluções que você pode querer considerar, mas elas têm desvantagens, elas também assumem que você está usando o Linux ou outro * nix.
Uma opção que você pode usar aqui é usar unionfs . O Unionfs fornece basicamente um método para combinar dois sistemas de arquivos. A desvantagem aqui é que unionfs não está disponível em todos os sistemas por padrão. Você pode ter que recompilar um kernel.
Então, basicamente, você pode configurar algo parecido com isso
/srv/www/basefolder (all the common files
/srv/www/localstuff/site1.example.org (files unique to a specific site)
/srv/www/localstuff/site2.example.org
/srv/www/localstuff/siten.example.org
/srv/www/unions/site1.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site1.example.org)
/srv/www/unions/site2.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site2.example.org)
/srv/www/unions/siten.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/siten.example.org)
Outra opção seria simplesmente usar hardlinks. Configurar isso é muito fácil de fazer usando o rsync. A desvantagem disso é que você faz algo quebrar para muitos sites, se você não está prestando atenção. Se você esquecer, você terá um link restrito para todas as coisas e fará uma alteração nos arquivos em um único local, que mudará em todos os locais. Você também precisará executar novamente o comando rsync sempre que atualizar arquivos.
/srv/www/basefolder (all the common files
/srv/www/site1.example.org
/srv/www/site2.example.org
Use comandos como este para construir essa estrutura
rsync -vr /srv/www/basefolder /srv/www/site1.example.org --link-dest /srv/www/basefolder
rsync -vr /srv/www/basefolder /srv/www/site2.example.org --link-dest /srv/www/basefolder
É colocar todo o conteúdo comum em um lugar separado e criar muitos docroots com diferentes arquivos de configuração e pastas de imagens e links simbólicos para diretórios de dados comuns uma opção? Você pode até criar um script bash para a implantação automática dessa estrutura.
Não está claro o que usa a pasta / images / ou quantos scripts php você tem.
No entanto, seria possível reescrever o php para usar o config / HTTP_HOST.database.php para que ele seja escalado conforme você adiciona o virtualhosts. Se o código php usa o / images ou cria os links para / images ele pode ser reescrito para usar HTTP_HOST também (passado do Apache). Se os links vierem de outro aplicativo, você pode usar as regras de reconfiguração do apache para colocar as informações do vhost em solicitações de / images /, de modo que acabe com diretórios parecidos com / images /, mas mapeiam coisas exclusivas no disco.
Mais informações sobre HTTP_HOST no php:
Essa solução eliminaria a necessidade de duplicar dados para cada implantação de usuário, mas exigiria alterações de código e talvez regravaria as regras no apache.
Tags apache-2.2 domain documentroot