Hi! Do you wanna see the English version?

Blog

URLs amigáveis com mod_rewrite

Quinta-feira, 26 de Abril, 2007 | 25 comentários

Mais uma dica rápida da série dia-a-dia de um desenvolvedor Web. Agora se tratando de um módulo do Apache: mod_rewrite.

A idéia da dica, é fornecer uma regra simples sem níveis de seção na URL.

O que é mod_rewrite?

É um módulo escrito para o servidor Apache, responsável pela reescrita de URLs em páginas Web.

Hoje em dia, com a popularização de assuntos como SEO, usabilidade e acessibilidade, esta prática se tornou comum e está cada vez mais sendo utilizada por grande portais.

Antes de mais nada, para que o módulo mod_rewrite funcione, obviamente você deve ter configurado e ativado no seu servidor Apache.

Criando o .htaccess

Crie um arquivo com o nome ".htaccess" (exatamente desta forma), e mova para a pasta raiz do seu domínio (ou onde queira implantar a reescrita). Em seguida, insira o código abaixo:

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?cod=$1

Entendendo o código:

RewriteEngine On
Ativa o suporte à reescrita
RewriteCond %{SCRIPT_FILENAME} !-f
Não aplica a condição para arquivos
RewriteCond %{SCRIPT_FILENAME} !-d
Não aplica a condição para diretórios
RewriteRule ^(.*)$ index.php?cod=$1
Regra de reescrita onde qualquer string (.*) após a pasta, onde estiver o .htaccess, será interpretado por index.php passado na variável cod

Na prática, se você tem uma URL do tipo www.url.com.br/secao/subsecao/, será interpretada por www.url.com.br/index.php?cod=secao/subsecao/. E mais, você não terá limite de níveis para utilizar com as /.

Interpretando com PHP

Com seu arquivo de reescrita criado, você já pode criar uma lógica no seu arquivo PHP para que interprete e leia as URLs passadas.

Veja um exemplo auto-explicativo:

<?php
/*
 * separa a URL por "/" e insere num vetor (array)
 */
$url = explode('/', $_GET['cod']);


/*
 * imprime a string passada após a primeira /
 * no exemplo acima, seria: secao
 */
echo $url[0];

/*
 * imprime a string passada após a segunda /
 * no exemplo acima, seria: subsecao
 */
echo $url[1];
?>

Desta forma, você pode utilizar includes para suas seções, ou qualquer outro tipo de inclusão, uma vez que você já tem suas seções separadas.

Para quem quer ler mais sobre o assunto, recomendo a documentação do mod_rewrite. O Bruno também escreveu mais detalhadamente aqui e aqui.

Até a próxima dica da série dia-a-dia de um desenvolvedor Web...

25 comentários:

Rafael Marin disse:

Eu também já escrevi sobre URLs amigáveis lá no blog. O Wordpress usa algo parecido com o que tu colocaste aí, né?

Abraços  :-D

brunnolou disse:

Sem dúvida utilizar isso hoje em dia tem se tornado indispensável.

No meu site explico como configurar e ativadar o mod_rewrite no Apache.

http://www.brunnolou.com/blog/activar-mod_rewrite-no-ubuntu/

Israel Cefrin disse:

Ciro
Muito boa a explicação. Deu para entender muito fácil como usar o mod_rewrite (que muita gente até usa, mas não sabe como nem porquê.)
Realmente o wordpress usa essa \\\'tecnologia\\\', mas ele não explica em miúdos como faz isso, apenas manda renomear o htaccess.txt.
 :-)
[]´s

Maicon Junches disse:

Muito boa essa forma, valeu ai Ciro!

RInaldi Fonseca disse:

Olá Ciro,, parabéns pelo artigo, realmente as URL amigaveis ajudam muito no indexamento dos Sites juntos ao sites de buscas.

Att
Rinaldi Fonseca
www.grifemidia.com.br

Túlio Vargas disse:

Poxa, até que enfim um ótimo tutorial sobre URL Amigaveis !!
Muito bom mesmo Ciro !
Congratulation

[]´s

André de Castro Zorzo disse:

Ciro, legal o post, e apenas para complementar, as vezes é necessário configurar o apache para que ele entenda o .htaccess (em algumas instalações isso não está ativo por padrão), fazendo a seguinte configuração:

<code>Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all</code>

Carlos La Vega disse:

explode? ensinando pela forma noob é foda...

Rodrigo Maia disse:

Realmente ajuda muito no SEO.
A um tempo atrás fiz um vídeo tutorial sobre o assunto, pra quem quiser ver, tá ai o link:
http://videotutoriais.blogspot.com/2007/08/url-aucarada-com-o-modrewrite-do-apache.html

Abraços

Fillipe disse:

Olá Ciro,
muito bom.. agora só queria saber uma coisa:
Eu consigo usar esse mod para qualquer url ? Seria só tratá-la ?
Por exemplom, se eu tiver a seguinte url:
site.com/index.php?ir=teste&cat=noticia&id=id
ficaria
site.com/noticia/id

Pelo seu código é possível fazer isso ou teria que concatenar e especificar as sub-seções?

Vlw
abraços

CACA[COBRA] disse:

Eu tambem tenha a duvida acima

Ciro Feitosa disse:

@ Fillipe:

Conforme descrito neste artigo, qualquer string após o domínio será convertido em vetor no PHP, sendo "quebrados" após as barras "/".

Assim, se você tem a URL do tipo www.site.com.br/<b>noticia</b>/<b>id</b>, o script retornaria para você, o equivalente a:

$url[0] = '<b>noticia</b>';
$url[1] = '<b>id</b>';

Daí, basta realizar as suas críticas baseado nesses resultados ($url[0], $url[1]...).

Espero que tenha assimilado.

Abraço!

CACA[COBRA] disse:

Boa Ciro...fiz um teste e já aprovei  :D

Vilson Carlos disse:

Ciro, me diga tentei fazaer e deu certo mas as imagens somem, o que acontece será ?

Ivan Gorski disse:

Muito bom  ;) Parabéns.

Leonardo Filipe disse:

meu site fica dentro de /site

consegui fazer tudo certo mas as imagens, css e js quando ficam /ajuda/10/titulo
nao funciona só funciona quanto tem uma pasta tipo /ajuda

Vitu disse:

 :-|

po cara ..
o não to conseguindo fazer funcionar.

meu .htaccess ta assim

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?view=$1

e tmb ja dei load no mod_rewrite.so

o que ta faltando?

coloquei o .htaccess no raiz e no teste/

John Marques disse:

recomendo esse tutorial tb muito bom

http://brunotorres.net/urls/comment-page-2#comment-89153

Bruno disse:

Fala cara! estou a um tempo procurando sobre o assunto, achei muitos tutorias os quais me deram uma boa noção! mas ainda não fiquei sem entender qual o papel do RewriteCond e de que outras formas posso utilizar se você tiver domínio sobre o assunto serial legal postar! vlw... fui!

Leonardo Cardoso disse:

Cara, ótimo tutorial!!!
Simples, e direto ao ponto.

Parabéns!

Rafael Gontijo Hamdan disse:

Imagens e arquivos interpretados pelo cliente (client-sided) sumirão caso a URL interpretada pelo php contenha o caractér "/", pois isso fará com que o navegador busque outro endereço (que no caso não existirá).

Uma boa dica para resolver este problema é criar um arquivo de configuração onde vc definirá valores como CONFIG_URL_IMAGES, CONFIG_URL_CSS, entre outros, assim, você incluirá diretamente da webpage "remota" (não há necessidade de fazer isso com includes do PHP, já que são server-sided).

Att,
Rafael H.

Alexandre Broggio disse:

Vlw pelo tuto

Evandro Victor disse:

Ciro,
seu post foi arrasador, agora unica coisa que é necessário contemplar é que se faz necessário habilitar nas configurações do apache a linha "LoadModule rewrite_module modules/mod_rewrite.so"

Albert disse:

Galera, tudo beleza?
Seguinte, estou com um problema que não consigo resolver.

Se alguém souber como fazer isso, por favor, me envia um e-mail me explicando!

Quero que todas as urls:
http://www.meusite.com/?videos=www.videos.com/restante-da-url/
Sejam reescritas para: http://www.meusite.com/videos/restante-da-url/

Conheço algumas coisas de redirecionamento de urls, mas isso não
consigo fazer. Sei que é fácil, mas não tô conseguindo.

E aí, pode me ajudar?

Abraços

Albert
meninoalbert@gmail.com

Schneider disse:

Ótima dica, obrigado!

Comente:





Comentário enviado!

Divulgando Vagas de Emprego: