URLs Amigáveis – .htaccess


Urls amigáveis são as urls “semânticamente corretas”; possuem um sentido e são compreensíveis a usuários leigos. Além da vantagem estética, as urls amigáveis ajudam as máquinas de busca na indexação, e são interessantes no sentido de “esconder” a tecnologia que está sendo utilizada.

Por exemplo:
www.meusite.com.br/exibeFotos.php?idAlbum=2&idFoto=35

Nesta url, vê-se que seu site utiliza o php, além de serem exibidas explicitamente duas variáveis GET.

Com a url amigável, você poderia deixar:
www.meusite.com.br/exibeFotos/2/35

Vou explicar aqui um modo de fazer, utilizando o arquivo .htaccess e php.

O .htaccess é um arquivo do apache, utilizado por exemplo para dar permissão de acesso à pastas do servidor. No nosso caso, ele será o “tradutor” das urls.

O .htaccess não transforma a url comum em url amigável. Ao contrário, traduz a url amigável em url “normal”. O que ele faz basicamente é ler a url do browser do usuário (a url amigável), enviada na forma de requisição para o servidor web, e tenta “casar” a url com uma séria de regrinhas. Ao encontrar uma regra que se encaixa com a url, ela traduz para o termo correspondente, ou seja, a url normal. E é esta url que é enxergada pelo php no servidor.

Crie, ou se já existir, edite o .htaccess da pasta raiz de seu site. (sugiro que leiam um pouco sobre o .htaccess antes de prosseguir). No seu .htaccess ficarão as regras de reescrita, ou rewrite rules.

OBS: lembre-se de ativar o mod rewrite no seu servidor, para que as regras funcionem.

Vamos ao nosso .htaccess. Para que nosso exemplo funcione, coloque o seguinte:

RewriteEngine on
RewriteRule ^exibeFotos/([0-9]+)\/([0-9]+)\/?$ exibeFotos.php?idAlbum=$1&idFoto=$2

Pronto! Não vou explicar as expressões regulares, mas vamos tentar entender o que foi feito:

“RewriteRule ^” inicia uma regra de reescrita. Tudo o que aparece do “^” até o “$” é uma expressão regular. É essa expressão que deverá casar com a url amigável que você utilizará em seu site.

Comparem a url com a expressão regular. No nosso caso, nossa url é a seguinte:
www.meusite.com.br/exibeFotos/2/35
exibeFotos/([0-9]+)\/([0-9]+)\/

Nossa url possui a string “exibeFotos”, seguidos de dois números. Como a url casa corretamente com a regra, o endereço será convertido na segunda parte:
exibeFotos.php?idAlbum=$1&idFoto=$2

Basicamente é isso. Não vou explorar mais como fazer as regras de reescrita. Agora vamos às implicações sobre o site.

Se seu site já estava pronto, você deverá substituir TODAS os links de seu site pelas novas urls. Por exemplo, se você tiver um link na sua pagina da seguinte forma:

<a href=”xxxx.php?id=23&x=5”>Ir</a>

Você deverá trocar pela correspondente url amigável. Isso parece idiota, mas muita gente tem dificuldade de entender que o .htaccess não vai transformar as url do seu site. É você que deve fazer isso manualmente. Ele apenas pegará essa nova url e traduzirá para a url normal.

Outro ponto que dará bastante trabalho: suponha que sua url ficou da seguinte forma:
www.meusite.com.br/exibeFotos/2/35
e que seu .htaccess está traduzindo corretamente essa url.

Então para a parte da aplicação que roda no servidor está tudo bem. O php receberá todas as referências do arquivo corretamente. Mas o html é interpretado no browser do usuário. Isso quer dizer que o browser não saberá interpretar corretamente as referências de arquivos, pois não sabe que suas regras de reescrita existem.

Resumindo, isso acontecerá com todos as suas referências no html à imagens, arquivos css e arquivos de mídia.

Por exemplo, se você chama a imagem: <img src=”img/teste.jpg” /> no seu arquivo exibeFotos.php, o browser interpretará sua url amigável como um monte de pastas. Então ele irá procurar a imagem que você colocou na seguinte pasta no servidor:
exibeFotos/2/35/img/teste.jpg, e não encontrará o arquivo.

Uma forma de resolver isso é colocando as referências absolutas, ou seja, a url completa. No nosso caso:
<img src=”http://www.meusite.com.br/img/teste.jpg” />

Para fazer isso de forma a não comprometer seu site, fazendo-o dependente do domínio, sugiro um código simples em php para pegar a url correta:

<?php
$server = $_SERVER['SERVER_NAME'];
$urlPrincipal = “http://”.$server.”/”;
?>

Nas suas referências, coloque:

<img src=”<?=$urlPrincipal?>img/teste.jpg” />

Pronto. Algumas referências:
http://forum.imasters.uol.com.br/index.php?showtopic=203965

http://www.vivaolinux.com.br/dica/Utilizando-URL-Amigavel-no-Apache

  1. #1 by Rafael Vô - November 15th, 2008 at 22:14

    Bacana a explicação Godoy! Vale lembrar que existem frameworks que fornecem Url’s amigáveis automaticamente como o Code Igniter.

  2. #2 by Godoy - November 16th, 2008 at 07:15

    Boa observação!
    assim como o code Igniter, vários outros frameworks php fornecem essa facilidade: Akelos, cake..
    Muito bem lembrado, Vô.

  3. #3 by pedro - September 28th, 2009 at 16:14

    Mto bom! Gostei da explicação.
    Parabéns!

(will not be published)

Anti-Spam Protection by WP-SpamFree