Com toda essa moda de SEO, Web 2.0 e etc, os desenvolvedores estão se interessando em melhorar o que é mostrado para o usuário até na URL, pois isso é bom para a indexação nos sistemas de busca – adiciona palavras-chave na url – e deixa mais entendível para quem usa o site.
Com mod_rewrite você faz um mapeamento de como as URLs são exibidas, e a que endereço elas realmente apontam, por exemplo:
Você tem uma parte do seu site que lista usuários por localidade e a URL pra essa página é www.exemplo.com.br/usuarios.php?pais=Brasil&estado=PB&cidade=Campina Grande, se você usa o mod_rewrite você pode fazer com que essa página seja aberta através da URL www.exemplo.com.br/usuarios/Brasil/PB/Campina Grande, que deixa bem mais elegante e melhor de ser indexado pelos sistemas de busca, que não costumam indexar páginas com muitos parâmetros passados por GET. (Normalmente também tem dificuldade em indexar documentos em diretórios num nível muito abaixo da raíz, mas isso é menos crítico).
E a mágica funciona assim:
1 – Certifique-se que o mod_rewrite está habilitado no seu Apache.
Uma maneira simples de fazer isso é com <? phpinfo(); ?> e procurando na parte que mostra os módulos do Apache.
2 – Crie um arquivo .htaccess na raíz do seu site.
3 – Escreva as regras no seu .htaccess:
RewriteEngine on
RewriteRule usuarios/(.*)/(.*)/(.*)$ usuarios.php?pais=$1&estado=$2&cidade=$3 [L]
(Idealmente a RewriteRule fica numa linha só, a quebra foi feita aí por motivos de formatação do blog)
Aí eu estou dizendo para o apache redirecionar qualquer request que vem para /usuarios/XPTO/FOO/BAR para /usuarios.php?pais=XPTO&estado=FOO&cidade=BAR, e onde eu coloquei o (.*) pode ser qualquer regex.
Você pode escrever quantas RewriteRule quiser no seu .htaccess e o Apache vai usar a que primeiro casar com a situação, então é bom estar ligado nessa ordem de precedência, pois se você colocar algo como:
RewriteRule usuarios/(.*)$ usuarios.php?pais=$1 [L]
RewriteRule usuarios/(.*)/(.*)/(.*)$ usuarios.php?pais=$1&estado=$2&cidade=$3 [L]
Vai ter problemas, pois nunca vai entrar no segundo caso, já que o (.*) significa “qualquer caracter, 0 ou mais vezes”, então a / entra nesse bolo, e vc vai ser redirecionado para usuarios.php?pais=Brasil/PB/Campina Grande. Então é bom ter cuidado para usar as Regex corretas e a ordem correta.
Vantagens de se usar mod_rewrite:
1 – Caso você não queira, não precisa expor qual tecnologia você está usando (ocultando a extensão .php, .psp, .pl, .py ou seja lá o que for);
2 – As URLs ficam mais legíveis e relevantes para usuários e search bots;
3 – Você pode fazer uma “gambiarra” para deixar informações relevantes na URL mesmo que não precise delas na sua página, por exemplo: você tem uma loja, e tudo que você precisa para abrir os detalhes de um produto é o id dele: produto.php?id=123456, mas para deixar a url mais bacana e ser indexada melhor você cria a regra:
RewriteRule produto/(.*)/(.*)$ produto.php?id=$2 [L]
e usa essa URL com: www.exemplo.com.br/produto/NOMEDOPRODUTO/ID e o sistema só pega o id ($2), daí ficaria algo como: www.exemplo.com.br/produto/Nintendo Wii/123456
Desvantagens de se usar mod_rewrite:
1 – Você precisa ter um cuidado re-dobrado quando passar strings com caracteres especiais como o &. Pois o .htaccess redireciona pra o seu script, o PHP no caso, e o PHP vai entender o & não como parte da sua string, mas como o separador de parâmetros do GET.
2 – Não sei se em sites de muito tráfego e muitas regras, isso pode interferir (mesmo que muito pouco) na performance, pelo fato do Apache precisar ler e testar todas as regex na url. (também não sei se é feito assim, mas acredito que sim)
Minha experiência com mod_rewrite foi pouca, talvez eu tenha falado bobagem, e se eu tiver, por favor, corrijam-me nos comentários!