Hi! Do you wanna see the English version?
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.
É 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.
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:
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 /.
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...
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
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
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!