Informática Numaboa
Um site, múltiplos domínios
Sab 5 Dez 2009 14:03 |
- Detalhes
- Categoria: Dicas Gerais
- Atualização: Domingo, 06 Dezembro 2009 21:58
- Autor: vovó Vicki
- Acessos: 3883
Tenho vários domínios com numaboa e, por enquanto, apenas um site faz uso deles. Inicialmente configurei o DNS apontando todos eles para o endereço IP do servidor e, na configuração do webserver Apache, apontei todos eles para o mesmo diretório onde se encontra a área pública do site. Mas será que isto é a melhor solução?
Os pormenores
Como disse, tenho vários domínios para o meu site. Alguns deles são numaboa.com, numaboa.com.br e numaboa.info. Todos eles levam para a Aldeia Numaboa e mostram o mesmo conteúdo, tanto faz qual dos três endereços o usuário escolher. Até aí, tudo bem...
Para obter este efeito configurei três hosts virtuais no Apache. Para a versão 1.3, esta configuração é feita no arquivo /etc/apache/httpd.conf; na versão 2.0 existem três arquivos, um para cada domínio, em /etc/apache2/sites-enabled/nome.arquivo.
NameVirtualHost * <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.com ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.com.br ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.info ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost>
A desvantagem de múltiplos endereços para o mesmo site
Pesquisando no Google verifiquei que havia mais de uma referência para o mesmo conteúdo e que a diferença estava apenas no domínio. Finalmente caiu a ficha! O que eu estava fazendo era pulverizar o número de acessos e a consequência se tornou óbvia: eu mesma estava prejudicando meu ranking nos mecanismos de busca
Ato contínuo, resolvi estudar um pouco mais as configurações do Apache para tentar encontrar um meio de trocar o endereço:
numaboa.com/artigo1 20 acessos -- numaboa.com.br/artigo1 5 acessos |----> numaboa.com/artigo1 26 acessos numaboa.info/artigo1 1 acesso --
O esquema acima mostra a consequência óbvia se conseguirmos que os endereços com numaboa.com.br e numaboa.info forem trocados por numaboa.com. Depois de ler um bocado e de tentar entender como funcionam as diretivas de regras e substituições do Apache, cheguei à conclusão de que, como sempre, a solução é mais fácil do que parece de início. Vou contar os tropeços que tive, não para desanimar ninguém, mas para que todos possam aprender com os erros.
A configuração do Apache
Existe uma diretiva feita sob medida para fazer substituições - é a RewriteRule (regra de reescrita). Esta diretiva pede uma regra, de acordo com a qual serão feitas as substituições, e uma string de referência que será usada como base. A primeira coisa que tive que destrinchar foi a regra, cheia de caracteres esotéricos próprios das expressões regulares (regex):
RewriteRule ^/(.*) http://www.numaboa.com/$1 [L,R]
Isto transforma o endereço /www.numaboa.info/artigo1 em http://www.numaboa.com/artigo1. Neste caso, a regra é ^/(.*) e http://www.numaboa.com/$1 é a string de referência para a substituição. As regex são complicadas por natureza, mas, uma vez entendidas, facilitam a vida pra caramba. Acompanhe como funciona a regra e a substituição.
O sinal ^ é uma âncora e indica o início de uma string. Neste caso a string começa com uma barra /, pois a URL de referência é representada na forma /www.numaboa.info/artigo1 (ou /www.numaboa.com.br/artigo1). Se, ao invés da regra completa, usarmos apenas ^/ e se a string de referência fosse apenas http://www.numaboa.com/, a substituição daria como resultado
http://www.numaboa.com/www.numaboa.info/artigo1
Esta é a primeira parte do resultado que queremos obter, pois a primeira barra "/" da URL foi substituída por "http://www.numaboa.com". Uma das características do motor regex é parar depois da primeira vez em que a regra aplicável.
Que tal dividir a URL em grupos usando a barra "/" como delimitador? Se assim o fizermos, a URL /www.numaboa.info/artigo1 fornecerá dois grupos, "/www.numaboa.info" (o grupo 0) e "/artigo1" (o grupo 1). Para obter estes grupos usamos os parênteses que, nas expressões regulares, servem exatamente para propósito. Neste caso, numa primeira etapa, nossa regra se transforma em ^/(). Agora falta informar o que pegar para formar cada grupo. Como queremos a string completa, usamos o ponto seguido por um asterisco e a regra fica assim: ^/(.*). Nas regex, o ponto significa qualquer caractere e o asterisco indica para pegar todos eles (na verdade, o asterisco significa zero ou mais ocorrências do elemento precedente).
De posse dos grupos podemos fazer a substituição de acordo com a string de referência: o grupo 0 (/www.numaboa.info) será substituído pela string literal http://www.numaboa.com e o grupo 1 será substituído por ele mesmo (/artigo1). Na string de referência $1 representa o grupo 1. Até aqui, tudo o que foi visto faz parte do "raciocínio" regex.
Mas o que acontece se a URL for /www.numaboa.info/seção1/artigo1? Pela explicação dada até agora, a URL será substituída por http://www.numaboa.com/seção1, o que não está correto. Neste ponto entram em ação as flags que o Apache oferece. A flag L (de Last, último) faz com que o processamento da regra seja interrompido logo depois da primeira vez em que a regra tenha sido aplicada, ou seja, a URL é "picada" apenas uma vez. Ao aplicarmos a flag L obtemos o grupo 0 (/www.numaboa.info) e, como o processamento da regra é interrompido, o grupo 1 fica com o resto (/seção1/artigo1).
Agora só falta informar o Apache de que ele deve redirecionar o navegador para o endereço completo fornecido. Como o endereço precisa ser totalmente qualificado (fully-qualified) colocamos http://www.numaboa.com na string de referência (e não /www.numaboa.com). Para forçar o redirecionamento usamos a flag R (de Redirect, redirecionar) do Apache.
Finalmente está tudo pronto e podemos escolher onde colocar a diretiva. Esta pode ser adicionada à configuração de host virtuais ou num arquivo htaccess. Como é mais fácil e rápido usar um htaccess para fazer um teste, coloquei o arquivo no diretório raiz do site (lembre-se de que o htaccess precisa ser um arquivo oculto, portanto seu nome precisa ser precedido por um ponto .htaccess) e chamei uma página usando http://www.numaboa.info. Para minha decepção, não aconteceu nada
O motivo é muito simples: antes de reescrever é preciso acionar o motor de reescrita do Apache, senão a substituição não é feita:
RewriteEngine On RewriteRule ^/(.*) http://www.numaboa.com/$1 [L,R]
Minha solução definitiva
Como costumo ser muito avarenta em relação a arquivos htaccess, preferi eliminar o htaccess do diretório raiz e colocar as diretivas nos hosts virtuais:
NameVirtualHost * <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.com ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.com.br RewriteEngine On RewriteRule ^/(.*) http://www.numaboa.com/$1 [L,R] ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin admin@numaboa.com.br DocumentRoot /www/numaboa.com/public_html ServerName www.numaboa.info RewriteEngine On RewriteRule ^/(.*) http://www.numaboa.com/$1 [L,R] ErrorLog /www/numaboa.com/logs/error_log CustomLog /www/numaboa.com/logs/access_log common </VirtualHost>
Depois da alteração, reiniciei o Apache para que a nova configuração entrasse em ação. Foi vapt-vupt