Desmistificando URLs amigáveis com php e htaccess (apache)
Boas!!
A quantidade de pessoas que perguntam como fazer URLs amigáveis no forum.imasters é enorme. Seja em WebStandars, SEO ou php, a dúvida é sempre a mesma.
É simples de fazer. Basta ir com calma e procurar entender tudo o que você está fazendo.
A reescrita é para o servidor, e não para você
As suas tags de link e a forma com que vc abrirá os seus conteúdos, você mesmo terá que alterar. Então onde você usava:
<a href="?page=contato">Contato</a>
Agora passará a escrever:
<a href="/contato">Contato</a>
E se precisar de mais parâmetros, indique-os:
<a href="/edit/user/1">Editar usuário</a>
Isso significa, que o servidor irá receber a requisição em /contato, ou /edit/user/1, e com a RewriteEngine, irá traduzir para o que vc realmente queria dizer, que era ?page=contato, ou ?action=edit&model=user&id=1.
Fica muito mais bonito depois de reescrito, mas para isso é necessário que as suas regras traduzam o amigável para a querystring.
Estude expressões regulares
O arquivo .htaccess que é uma “configuração” externa do apache, acessível da sua aplicação, desde que liberado na configuração do servidor, te possibilita a configurar diversas coisas do ambiente. E as RewriteRules fazem ainda mais sentido, e serão mais poderosas se vc souber Expressões Regulares.
Ahh página em branco, erro 500
São duas as possibilidades, ou a sua hospedagem não suporta configuração via htaccess (muito difícil), ou vc cometeu algum erro de sintaxe, e quebrou o servidor, lembra que o htaccess é um arquivo externo de configuração do apache ? pois é, faça algo errado, que vc terá um 500 na tela.
Não é necessário re-startar o servidor após escrever suas regras, mas cuidado com o cache do teu browser, pois uma regra bem escrita pode parecer ainda não estar funcionando, se o chrome cachear a requisição, e continuar te devolvendo erro.
Mãos na massa
Comece, e para isso vc precisa “ligar” a engine de reescrita:
RewriteEngine On
Lembrando que ela já deve estar instalada no apache, a linha acima, apenas “avisa” que vc irá utilizá-la. O meu arquivo para saber se está funcionando e receber a requisição será o teste.php, com o seguinte conteúdo:
<?php
var_dump($_GET);
O que eu quero é acessar a url /edit/user/1, e receber o seguinte no GET:
array(3) {
["action"]=>
string(4) "edit"
["model"]=>
string(4) "user"
["id"]=>
string(1) "1"
}
Ok, vamos lá.
Primeiro devo identificar as partes da minha URL. /edit/user/1 é composto por um grupo de letras, seguido por uma barra, outro grupo de letras, outra barra e um número.
Simples!
A Expressão Regular para isso é: ([a-z]+)\/([a-z]+)\/([0-9]+)
Básico não ? apenas escapei as barras com barras invertidas, para não quebrar a sintaxe da ER.
O que eu quero realmente receber na aplicação é teste.php?action=$1&model=$2&id=$3
, sendo cada $n, o número do grupo em sequência ao que foi casado pela ER anterior.
Sintaxe da regra
Bem simples, é composta por 3 partes:
RewriteRule <regular expression> <url to translate> [FLAGs]
Aplicando ao caso acima, fica:
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)$ teste.php?action=$1&model=$2&id=$3 [NC,L]
Adicionei ^ no início da ER, para indicar que a requisição deve começar com aquele padrão, e $ para indicar que ali a ER acaba, e não deve casar nada mais diferente disso.
Utilizei as flags [NC] para ignorar sensitive case, então se a url for: http://wbruno.com.br/EdIt/uSeR/1 a ER continua funcionando, e [L] para dizer que se a ER casar, essa é a última regra a ser testada, e deve processá-la, e não continuar procurando mais ERs e ver se outra abaixo dela também casa.
E para /contato, a minha ER fica simplesmente:
RewriteRule ^([a-z]+)\/?$ teste.php?page=$1 [NC,L]
note que os padrões não são conflitantes, então podem coexistir no mesmo htaccess.
Funcionando:
http://wbruno.com.br/scripts/edit/user/1
http://wbruno.com.br/scripts/fale-comigo
Não redirecione tudo para a index
Alguns frameworks e alguns preguiçosos têm a mania de fazer coisas parecidas com isso:
RewriteRule . /index.php [L] #retirei esse do wordpress :p
e ai parsear toda a URL do lado da aplicação.
Eu não aconselho, pois vc terá deixado tudo mais lento, uma vez que um trabalho que deveria ser feito no servidor, foi delegado a aplicação, e agora você é dependente de reescrita, e se por algum motivo ela não for suportada na hospedagem, não irá funcionar sem ela.
Dá para entender o motivo do WP utilizar, pois são tantos padrões, e tantas opções de URL amigável que vc pode configurar, que para a app é até mais simples parsear nela, mas na sua, evite usar. Eu pelo menos prefiro trabalhar assim. =)
E ai ? entendeu #comofas?