Passando informações numa URL utilizando RewriteRules ao invés de QueryStrings

Um pequeno tutorial para quem faz sistemas que precisam de pretty Urls

Exemplo tosco:

Você tem um formulário de pesquisa que permite ao usuário escolher uma categoria de um livro, o nome do autor e/ou a editora de uma obra.

A URL gerada para uma pesquisa deste form seria algo como:

http://localhost/pesquisa.php?categoria=12&autor=22&editora=12
ou se escolhermos apenas o campo editora:
http://localhost/pesquisa.php?editora=12

Se quisermos transformar o resultado desta pesquisa, num link interpretável pelos mecanismos de busca precisamos utilizar o recurso RewriteRules do Apache.

A URL ficaria assim:
http://localhost/pesquisa/categoria/12/autor/22/editora/12

O arquivo .htaccess precisaria das seguintes diretrizes:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php
RewriteRule ^pesquisa pesquisa.php
RewriteRule ^(.+)categoria/([0-9]+)/? pesquisa.php/?categoria=$2 [QSA]
RewriteRule ^(.+)autor/([0-9]+)/? pesquisa.php/?autor=$2 [QSA]
RewriteRule ^(.+)editora/([0-9]+)/? pesquisa.php/?editora=$2 [QSA]
</IfModule>

A flag [QSA] (Query String Append) faz com que o Apache concatene todas as Query Strings tratadas nas regras definidas do arquivo. Desta forma, não importa a ordem que você utiliza para construir a URL. As duas formas abaixo irão funcionar:

http://localhost/pesquisa/categoria/12/autor/22/editora/12
http://localhost/pesquisa/editora/12/autor/22/categoria/12

Um pouco sobre as expressões regulares

Nunca me dei bem com essas benditas RegExp, mas vou tentar explicar as principais que utilizei neste exemplo:

^(.+)categoria/([0-9]+)/?

o ^ indica o início da string, neste caso, a URL do navegador, pra ser mais especifico, tudo o que está entre a primeira barra após o nome do host e a primeira interrogação (inicio da querystring), ou seja, no nosso exemplo de pretty URL, seria:
/pesquisa/categoria/12/autor/22/editora/12

O “.+” indica que 1 ou vários caracteres podem ser encontrados entre o início da string (determinado pelo sinal ^) e a palavra “categoria/”. Estes dois caracteres estão entre parenteses “(.+)” pois desta forma o apache entende que o que for encontrado que corresponda à este expressão regular deve ser armazenado numa variável. Neste caso, por ser o primeiro parenteses, a variável será $1

A expressão [0-9] indica que procuramos caracteres numéricos (de 0 a 9). O sinal “+” após “[0-9]” indica que procuramos um ou mais caracteres desta espécie e os parenteses que envolvem a expressão toda “([0-9]+)” indica que queremos armazenar o resultado encontrado por essa expressão numa variável. Como é o segundo conjunto de parenteses, esta variável será a $2.

Finalmente, a expressão “/?” no fim da string, nos diz que pode haver ou não uma “/” no fim da expressão “categoria/([0-9]+)”. O sinal de interrogação representa 0 ou uma ocorrência da expressão que ele acompanha.

Ufa!

Deixe uma resposta