Desenvolvendo vários sites no Apache
Se você cria aplicativos Web em PHP e MySQL, certamente usa o Apache como servidor Web, instalado em um computador local, para desenvolver seus produtos antes de publicá-los na Internet. O Apache é o "webserver" mais popular da Internet já faz um bom tempo, e, apesar de ter suas origens nos sistemas Unix, é portado para diversas plataformas modernas. No Apache temos basicamente o "diretório raiz" do site, sob o qual devem ficar todos os arquivos e subdiretórios do site e, principalmente a página "index.php". No caso do XAMPP, esse diretório é o "htdocs".
Quem desenvolve, obviamente trabalha em vários sites, de vários clientes e fica inviável ter um servidor Web para cada "case". O resultado é que criamos um diretório para cada projeto dentro do diretório raiz do site. Até aí, ok! O problema começa quando precisamos acessar o site que está sendo editado, via navegador, pelo endereço http://localhost/
padrão das plataformas AMP (Apache, MySQL e PHP).
Todos os exemplos seguintes serão baseados no XAMPP para Windows (Sim! Sou um porco capitalista!). Se você usa o Apache noutro pacote ou plataforma, adpte seu case.
Finge que "localhost" é "example.com"...
Um servidor Web está para nosso provedor de hospedagem, assim como o endereço http://localhost/
está para o endereço do nosso site na Internet, como por exemplo http://example.com/
. Se pensarmos desta forma - que é a correta -, ao acessar o site do seu cliente do "PetShop" pelo servidor Web local, você digita no navegador http://localhost/petshop/
, correto? Já que você salva os arquivos deste site no diretório raiz ("htdocs" do XAMPP).
Acontece que todos os sites, na verdade, são referênciados como um só: http://meusite.com.br/
; e eles são subdiretórios deste site. Daí, quando você transferir o site do "PetShop", por exemplo, do servidor Web para o provedor de hospedagem lá na Internet? O endereço do site ficará http://petshot.com.br/petshop/
? E como ficaram os caminhos dos seus atributos link, href e src?
Eu, pessoalmente, prefiro usar caminhos absolutos nos meus sites, onde a /
representa a raiz do site. Por exemplo, para fazer um link para a home page (index.php
), basta codificar:
<a href="/">HOME</a>
Isso vale para qualquer página do site, mesmo aquelas que estão dentro de subdiretórios.
E para mostrar o logotipo, em QUALQUER página do site:
<img src="/img/logo.png" alt="Logotipo">
Isso funcionaria se você armazenasse o site diretamente na pasta raiz do servidor, normalmente na pasta htdocs
ou www
, dependendo do ambiente, mas não é o que acontece. Se você desenvolveu o site em um subdiretório "PetShop" do diretório raiz, por exemplo, para criar um link para a home page você teria que usar caminhos relativos e fazer algo como:
<a href="../index.php">HOME</a>
E para o logotipo de uma página qualquer que está em um subdiretório, por exemplo, poderíamos ter algo como:
<img src="../../img/logo.png" alt="Logotipo">
Percebeu as diferenças?
Solução 1) Uma raiz para cada site
Quando eu percebi que a metodologia de vários subdiretórios dentro da raiz não daria certo, criei uma alternativa: passei a ter um diretório htdocs
para cada site. Assim, no XAMPP, que é o pacote que uso, tinha vários diretórios, como:
C:\xampp\htdocs\petshop.com.br
C:\xampp\htdocs\sexshop.com.br
C:\xampp\htdocs\bardozizinho.com
Criei uma rotina louca: quando vou trabalhar no site "petshop.com.br", por exemplo, renomeio o diretório C:xampphtdocs petshop.com.br
para C:xampphtdocs
, que o Apache reconhece como a raiz do site no XAMPP...
Agora, preciso trabalhar no "bardozizinho.com"? Renomeio então C:xampphtdocs
para C:xampphtdocs petshop.com.br
novamente e então C:xampphtdocs bardozizinho.com
para C:xampphtdocs
. E o site do "bardozizinho.com" está no ar...
Entendeu a dinâmica? Complicado, mas, pra ganhar ($) dinheiro, agente se adapta!
Solução 2) Subdomínios com Wildcard
Todo esse troca-troca de nomes de diretórios pode se tornar cansativo, e se você está cansado + estressado, pode acabar cometendo erros como salvar o "SexShop" no lugar do "PetShop", entregando assim o produto errado para o cliente. Vich!
Foi daí que, um belo dia, dando algumas aulas de servidor Web com Apache, me lembrei que esse poderoso Webserver suporta subdomínios, redirecionamentos e "Wildcards". E, quem é o nosso servidor Web favorito? Sim, justamente o Apache!
Voltamos à situação anterior, onde cada site ocupa um subdiretório da raiz (htdocs
...), só que agora, assim:
C:\xampp\htdocs\petshop
C:\xampp\htdocs\sexshop
C:\xampp\htdocs\bardozizinho
Depois de configurar o Apache, para acessar cada site com seu próprio domínio, usamos:
http://petshop.localhost/
http://sexshop.localhost/
http://bardozizinho.localhost/
Cada site agora tem seu prório endereço na forma de um subdomínio independente e também sua própria "raiz" no servidor Web, então, podemos voltar usar caminhos absolutos nos links.
A configuração é razoavelmente simples e só precisa ser feita uma vez:
Abra o arquivo de configuração do "Apache" em um editor. Esse arquivo, normalmente se chama httpd.conf
e costuma ficar no subdiretório C:xamppapacheconf
, no caso do XAMPP do Windows. Se você é "estranho" e não usa o XAMPP ou o Windows, procura este arquivo dentro do diretório do seu servidor Web, que vai encontrá-lo.
Com ele aberto, localize a linha abaixo e descomente-a removendo o #
que está no começo. Ficará assim:
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Também localize e remova o #
do começo da linha:
Include conf/extra/httpd-vhosts.conf
Agora, localize e abra o arquivo httpd-vhosts.conf
que normalmente fica dentro do diretório C:xamppapacheconfextra
. Com ele aberto, apague todo o seu conteúdo, substituindo por:
UseCanonicalName Off
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/"
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
ServerAlias *.localhost
VirtualDocumentRoot "C:/xampp/htdocs/%1/"
</VirtualHost>
Salve e feche os arquivos abertos e reinicie o Apache, conforme seu sistema permitir.
E... Pronto!
Dicas finais
Os Subdomínios com Wildcard funcionam em qualquer compilação do Apache em que o módulo mod_vhost_alias
esteja presente, o que é a maioria dos casos. Mesmo se você não usa um pacote AMP, preferindo instalações stand-alone dos serviços "Apache", "MySQL" e "PHP", a dica funciona. Agora mesmo, estou testando no Debian Linux 10 (sim, sou estranho!) e funciona perfeitamente.