Apache, mod_rewrite e URL Amigável

7 11 2007

Apache

As Url´s Amigáveis, como simpaticamente chamam a técnica de Rewrite, viraram rapidamente o atrativo da bolha web 2.0 pelo fato de atrair mais usuários e ainda dar mais relevância ao seu conteúdo, mais o que tem de legal nisso tudo ?

http://www.site.com.br/index.php?artigo=25&cat=amor&dia=10

Você pode conseguir:

http://www.site.com.br/index/artigo/25/cat/amor/dia/10/
http://www.site.com.br/artigo/amor/dia/10/
http://www.site.com.br/Site-25-amor-10.htm

ou seja, cerveja (piada mal posicionada), você poderá manipular da forma que achar melhor a sua URL, mais qual o objetivo ?

Além de tornar mais “amigável” ao usuário isso facilita muito nos motores de busca, e normalmente um link desses atrai sempre mais visitantes.

Ao que interessa então:

mod_rewrite, como diz o nome re-write, reescrever, este modulo convete uma url em qualquer formato em um formato pré programado por voce.

Etapa 1 – Configuração

Verifique dentro do seu httpd.conf por:

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Se os mesmos estiverem comentados (# na frente), descomente ambos (retire o #) e reinicie o apache.

No caso do Debian 4 Etch, as linhas em questão deverão estar em mods-avaliable/rewrite.load e ou .conf e veja se o link simbolico está criado em mods-enabled/ se não estiver criado basta criando então.

ln -s origem destino

Etapa 2 – Arquivo .htaccess

Nesta etapa deve-se criar o arquivo .htaccess (ex: touch .htaccess) se o mesmo já existir, apenas verifique as permissões dele de leitura e escrita

É interessante setar como grupo e usuario do arquivo os dados utilizados pelo apache,

Ex: chown www-data.www-data .htaccess (no caso de www-data ser o utilizado pelo seu apache)

Obs: O arquivo deverá ser criado ou deverá existir no mesmo local que foi definido no apache o DocumentRoot (diretório principal)

Etapa 3 – Criando sua Url Amigável

Passo a passo agora, a minha url em questão é:

http://www.site.com.br/index.php?artigo=25&cat=amor&dia=10

Agora sim, vamos editar o .htacess com seu editor preferido e inserir:

Options +FollowSymLinks
RewriteEngine on
RewriteRule Teste(.*)-(.*)-(.*)\.htm$ /index.php?artigo=$1&cat=$2&dia=$3

Complexo ? nada é até simples demais, vamos decompor:

Options +FollowSymLinks: A opção FollowSymLinks ativada determina que o Apache deverá solicitar o arquivo real do link simbolico que será criado, sem isso resultaria em um erro 505 (em alguns casos sem essa opção funciona mesmo assim pois não foi necessário a criação de links simbolicos).

RewriteEngine on: Ativa a engine (motor) do rewrite.

RewriteRule Site-(.*)-(.*)-(.*)\.htm$ : Esta parte é o fundamento do Rewrite, é a criação da regra que será utilizada na montagem da nova URL, nessa sentença podemos traduzir que a nova URL será montada da seguinte forma: Site-1-2-3.htm sendo 1,2,3 parametros de $ definido ao final, mais quem são esses parametros ? espera p****.

/index.php?artigo=$1&cat=$2&dia=$3 : Está parte trabalha em cima da nossa URL original, repare que a URL está sendo decomposta em parametros $1, $2, $3, isso mesmo, os mesmos que serão substituidos na abordagem anterior, simples demais, ah você quer colocar o dia como sendo paramêtro ? /index.php?artigo=$1&cat=$2&$3=$4 , resolvido basta agora alterar na URL de saída.

Finalizando, tudo isso irá gerar a URL

http://www.site.com.br/Site-25-amor-10.htm a partir de

http://www.site.com.br/index.php?artigo=25&cat=amor&dia=10

Isso é só o começo, da pra brincar muito no .htaccess e ainda tem muitos links legais por ai, confiram:

Gerador de .htaccess
Manual do mod_rewrite

Obs:  é .htaccess e não .htacess





Apache, mod_proxy e vhosts

5 11 2007

Apache

Antes de mais nada, qual a utilidade do modulo mod_proxy no Apache ?

Bom, no meu caso resolveu o seguinte problema:

http://www.exemplo.com,
Com arquivos em Servidor 1 (192.168.3.10)

http://adm.exemplo.com,
Com arquivos em Servidor 2 (192.168.3.11)

http://rh.exemplo.com,
Com arquivos em Servidor 3 (192.168.3.12)

Sendo o Servidor 1 o “cara” habilitado com o link da embratel de porte do Apache 2.

Tudo planejado …

Mais como um unico servidor iria gerenciar seu proprio dominio e outros dois (subdominios) sendo que os mesmos com os arquivos referenciados na rede cada um com seu determinado IP.

Sim eu tentei mapear as unidades, ideia infeliz …

Agora vamos ao que interessa, lendo alguns artigos publicados pelos colaboradores do Apache, verifiquei algo interessante no mod_proxy, que faria justamente o que eu precisava:

Mod_proxy: Redirecionar as requisicoes de certas URL’s para outros servidores web.

Vamos fazer funcionar, no httpd.conf insira:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so

LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

Verifique os caminhos corretamente.

Em seguida vamos a configuracao dos vhosts (virtual host).

NameVirtualHost *
<VirtualHost *>
ServerName adm.exemplo.com

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://192.168.3.11/
ProxyPassReverse / http://192.168.3.11/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>

Lembrando que para varios vhosts basta repetir o codigo acima entre as tags VirtualHost alterando o subdominio e o IP da rede.

Seguindo o codigo acima, a unica coisa nova que vemos sao as tags proxy que indicam que sera liberado o acesso para todos (eh possivel restringir para acesso apenas local, interessante para alguns casos), e tambem vemos:

ProxyPass / http://192.168.3.11/
ProxyPassReverse / http://192.168.3.11/

No portugues claro, temos, Passe para 192… no caso desse VHost faca revesao para 192… a barra antes do IP indica em qual pasta sera utilizado para acessar aquele vhost.

No meu caso utilizei um servidor rodando Debian 4 etch, portanto os arquivos que utilizei para a configuracao sao um tanto quanto diferentes ao httpd.conf (que eh o utilizado na maioria dos casos). Os “LoadModules” deverao ser inseridos em proxy.conf dentro de mods-enabled e as configuracoes dos vhosts irao em default dentro de sites-enabled.

Obs: Sim, estou sem acentos.

Links: Apache, Tutorial mod_proxy