Como prometido, hoje vou continuar o tutorial sobre URLs amigáveis… Ontem fizemos uma introdução e explicação básica sobre as regras simples e hoje vamos falar sobre regras mais complexas que usam expressões regulares.
Atualização 30/04/10: Adicionei algumas informações extras e fiz algumas correções nas RewriteRules.
### Reescrevendo URLs que possuem parâmetros
Continuando o nosso exemplo, faremos agora a reescrita de URL do seguinte caso:
http://meusite.com/produtos.php?id=2
(A URL atual)
http://meusite.com/produtos/camiseta-rosa/2/
(A nova URL)
Nesse caso temos dois termos importantes na URL:
O termo marcado em amarelo identifica de qual URL estamos tratando, no nosso caso será a URL de exibição de um produto (um possível caso pra uma loja-virtual) o que poderia ser o mesmo caso da exibição de uma notícia ou artigo em um site com esse tipo de conteúdo.
O termo marcado em verde é o ID do produto... Esse é o valor que será usado internamente pelo seu produtos.php
para exibir o produto correto. Perceba que esse mesmo termo precisa estar presente na nova URL pois é exatamente ele que será usado pelo seu arquivo "antigo" quando a URL for redirecionada.
Perceba também que adicionamos um novo "termo" (valor) que é o nome do produto... Isso ajuda a melhorar a URL trazendo mais informações relevantes, aumentando a pontuação da página nos sistemas de busca e dizendo para o visitante o que ele verá ao clicar naquela URL.
Você precisa entender que essa informação adicional, a princípio, não faz diferença alguma pro funcionamento do seu site, é apenas um bônus já que o seu sistema continuará identificando o produto pelo seu ID que está na última parte da URL.
### Reescrevendo a URL
O nosso .htaccess
para reescrever a URL anterior (da página de contato) e essa nova URL mais complexa, ficará assim:
RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC]
Vai ser preciso começar a entender um pouco sobre expressões regulares agora... Vamos lá!
### Expressões Regulares
As expressões regulares ou RegExp ou ER são formas de você validar uma string (texto).
Suponhamos que você precise verificar se uma string é composta apenas por letras minúculas. Você pode fazer isso com a expressão regular ^[a-z]+$
, vamos tender o que isso significa:
O circunflexo ^
significa "o começo da string" e o cifrão $
significa "o fim da string"... Então, toda a ER que estiver entre o ^
e o $
precisa "validar" pra toda a string, e não apenas uma parte dela.
Entre eles temos [a-z]+
, isso significa: um grupo de caracteres (delimitado pelos colchetes [ ]
) composto por "qualquer letra minúscula" (a-z
) que tenha no mínimo 1 caractere +
.
A expressão regular a cima iria validar strings como planeta
e casa
mas iria invalidar strings como casal feliz
, planeta1
, CaSa
ou pôr-do-sol
pois essas strings não possuem apenas letras de a-z minúsculas.
Outro exemplo que podemos usar é a expressão ^[0-9]{3,9}-(.*)$
que vamos "destripar" agora:
Começamos com [0-9]{3,9}
que significa um grupo de números (de 0 a 9) que tenha entre 3 e 9 dígitos, ou seja: qualquer número de 3 até 9 digitos.
Depois temos um hífen -
normal.
E no final da ER temos (.*)
que significa, acreditem se quiser, qualquer caractere! Qualquer coisa! Calma... calma! Eu explico: o ponto .
é o caractere coringa das expressões regulares, e o asterisco *
signficia "nenhuma, uma ou mais de uma 'unidade' do caractere anterior".
Sabendo disso, podemos entender que a expressão regular ^[0-9]{3,9}-(.*)$
valida strings como 014-a8!@cas
, 11111-eahuaa
e 123456789-
, mas não valida strings como 0-a8!@cas
, -eahuaa
, 8928745614-abc
e 89-abc
pois as mesmas não começam com "números entre 3 e 9 digitos" [0-9]{3,9}
.
Poderiamos modificar a expressão regular para: ^[0-9]{3,9}-
e ela teria o mesmo comportamento pois só precisamos verificar o começo da string... :)
Recomendo que você pare um pouquinho para ler o [Guia de Expressões Regulares](http://guia-er.sourceforge.net/), é muito bom e vai te ajudar a entender melhor uma das sete maravilhas da Informática que é uma Expressão Regular.
Agora vamos voltar a nossa URL Amigável:
RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC]
#### Primeira parte
Na primeira parte, em amarelo, temos ^produtos/([a-z0-9-]+)/([0-9]+)/?$
, o que isso significa?
Vamos dividir essa parte em pequenos blocos e explicar cada um:
^produtos/
- A URL precisa começar com produtos/
/([a-z0-9-]+)/
- A expressão regular ([a-z0-9-]+)
significa "no mínimo um(a) +
letra minúscula a-z
OU letra maiúscula A-Z
OU número 0-9
OU um hífen -
"
/([0-9]+)/?$
- E por fim temos ([0-9]+)
que signfica "no minimo +
um número 0-9
" seguido de uma barra opcional /?
e o fim da url.
Isso tudo significa que, com a primeira parte, validamos strings como /produtos/camiseta-azul/2/
, /produtos/bola/89/
e /produtos/cachecol-rosa-da-2a-africa-do-sul/666/
e invalidamos strings como /produtos/palhaço/a/
, /produtos/camisa/
ou /produtos/camiseta legal/187a/
.
#### Segunda parte
Na segunda parte, em amarelo, temos /produtos.php?id=$2&nome=$1
, o que isso significa?
Significa que iremos passar os valores encontrados na primeira parte para uma nova URL interna, ou seja, chamaremos o arquivo /produtos.php
e passaremos dois parâmetros via GET para ele:
Temos $2
no parâmetro id
, esse "sifrao dois" significa a segunda "variável" encontrada na URL, que nesse caso é a parte ([0-9]+)
da expressão regular, que conterá o ID do produto.
E temos $1
no parâmetro nome
, esse "sifrao um" significa a primeira "variável" encontrada na URL, que nesse caso é a parte ([a-z0-9-]+)
da expressão regular, que conterá o nome do produto! :)
Com isso tudo, ao chamar a URL /produtos/camiseta-azul/2/
o Apache irá, malandramente e internamente, direcionar a requisição para o caminho /produtos.php?id=2&nome=camiseta-azul
.
Perceba que os valores (2 e camiseta-azul) foram passados para o "antigo" arquivo, cada um em seu devido lugar... Com isso, ao executar o arquivo /produtos.php
você terá acesso aos dois valores que foram passados na URL Amigável utilizando a super-global $_GET
:
Quer coisa melhor que isso minha gente?!
#### Terceira parte
Na terceira parte, em azul claro, temos [NC]
, que ja foi explicado antes e significa "No Case" ou "Sem distinção de minúsculas ou maiúsculas". :)
--
Só para reforçar para quem ainda não pegou a essência da coisa: Na primeira parte temos uma expressão regular que, se ela validar a URL que o visitante está acessando, a requisição vai ser redirecionada para o caminho especificado na segunda parte.
### Mais exemplos de URLs Amigáveis
Vamos ver mais alguns exemplos que podemos colocar no nosso .htaccess
e o entendimento de cada uma das regras, fica por sua conta:
Uma ferramenta que pode ajudá-los a testar expressões regulares é a [RegExr: Online Regular Expression Testing Tool](http://gskinner.com/RegExr/).
Espero realmente que vocês tenham gostado... Amanhã vou tentar abordar outros assuntos e, dependendo do retorno e das dúvidas que vocês deixarem nos comentários, faço outro artigo sobre URLs Amigáveis.
Um grande abraço, uma boa noite, e deixem mais comentários! :)