Neste artigo vamos entender mais sobre a tecnologia conhecida como URL Rewriting ou Rewrite engine, que, segunda a literatura, é uma técnica que permite a re-escrita de URLs, ou seja, possibilita que uma determinada URL original seja mascarada ou substituída por outra mais segura, apresentável e acessível para nós humanos e para os motores de buscas (Google, Yahoo, Msn e etc).
Nas próximas linhas será apresentado o que é realmente esta técnica, quais seus benefícios, como utilizar e configurar, uma demonstração de um exemplo prático e por fim algumas conclusões e referências.
Como dito anteriormente, os termos URL Rewriting ou Rewrite engine representam uma forma de mascarar uma determinada URL, tornado-a acessível de diferentes formas. Mas não é somente isso, se esta técnica for aplicada de uma forma correta, trará ótimos benefícios, que serão descritos nas próximas seções.
Na prática a responsabilidade deste mascaramento é do servidor web. O pioneiro desta técnica é o servidor web Apache, que implementa nativamente o módulo Mod_Rewrite, responsável por este processo.Antes de falar sobre Mod_Rewrite, para aqueles que estão perdidos, será mostrado logo abaixo um exemplo real deste técnica.
http://www.meusite.com/not.php?cat=9
Na linha acima foi mostrado uma URL que é normalmente encontrada na internet, que utiliza determinados parâmetros para filtrar, dentre uma base de dados, as informações que condizem com os parâmetros enviados. Para entender melhor, a página not.php irá mostrar uma lista de notícias ligadas ao parâmetro cat, que representa uma determinada categoria.
http://www.meusite.com/noticias/9/php-avancado.html
Através de outra URL bem diferente, é possível executar o mesmo processo que irá resultar nas mesmas informações. Mas nota-se um diferencial, que se utilizado de forma certa, pode-se adicionar nível de competitividade a URL. Isso mesmo, competitividade, se você se preocupa em tornar seu site mais conhecido, é importante aliar-se aos motores de buscas, por que eles trabalham dia e noite, e sem medir esforços, levam o seu site ao conhecimento de milhares de usuários. Mas para aparecer nas primeiras linhas, é necessário ficar atento a algumas questões, dentre elas você pode começar através da URL Rewriting.
São três pontos importantes que podem ser levados em conta ao se tratar dos benefícios do URL Rewriting:
Lembrando que os motores de buscas consideram com certo nível de importância em palavras chaves localizadas em URLs, desta forma, por que não utilizar desta vantagem. Voltando a segunda URL de exemplo, pode-se ver que foram adicionadas as palavras noticias e php-avancado. Nitidamente percebe-se que a segunda URL terá mais chances (considerando apenas a URL e não o conteúdo da página) de aparecer nos resultados do que a primeira URL, caso seja executado uma consulta que possua tais palavras. Devido a isso que existe a importância em se estruturar uma URL, se importando com pequenos detalhes, que em um todo, trará ótimos resultados.
Outro ponto que pode ser explorado está relacionado em tornar a URL mais agradável ou amigável (como outros articulistas descrevem) para nós humanos, permitindo assim uma maior compreensão. Algumas pessoas tentam se localizar dentro do site através da URL, desta forma fica bem mais fácil saber onde ela está localizada, se adotada a segunda URL de exemplo, em que está nítido na URL que a página trata de notícias sobre php avançado. Também deve ser considerada a memória, por que fica mais fácil decorar palavras do que códigos, principalmente quando o usuário não sabe para que servem.
Em relação à segurança a URL Rewriting pode evitar alguns problemas que ocorrem, como por exemplo, o SQL Injection. O módulo Mod_Rewrite do Apache utiliza Expressões Regulares para identificar qual URL está sendo executada e filtrar os dados necessários para a chamada da URL original. Desta forma, através destas expressões é possível invalidar informações indevidas passadas pela URL, que podem abrir brechas para a execução de códigos indevidos. Este assunto será citado novamente na seção que mostrará exemplos práticos sobre URL Rewriting.
Vimos até o momento uma introdução sobre URL Rewriting, juntamente com suas vantagens e motivações, que viabilizam a sua utilização. Mas agora iremos partir para a prática, será mostrado como habilitar o módulo Mod_Rewrite do Apache e como iniciar a sua utilização.
Para iniciar o funcionamento do Mod_Rewrite será necessário executar dois passos, primeiro alterar o arquivo de configuração do Apache (httpd.conf) e o segundo criar o arquivo .htaccess que conterá as instruções para a re-escrita.
No arquivo httpd.conf, localize as seguintes linhas:
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
Retire o comentário () das duas linhas, que resultará em:
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.cLocalize novamente as seguintes linhas:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
Substitua a palavra Nome por All, que resultará em:
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
Feitas as alterações, reinicie o Apache.Crie um arquivo chamado .htaccess e salve-o. Após concluir a edição, copie-o para o diretório raiz do servidor
(ex: /public_html).Inicie o arquivo com a seguinte instrução:
RewriteEngine OnEste comando habilita o módulo Mod_Rewrite. Lembrando que este arquivo não é utilizado apenas para esta finalidade, por isso a necessidade de iniciar o processo de re-escrita.
As instruções seguintes serão programadas para solucionar um problema simples como exemplo inicial, em que para todas as URLs executadas com extensão .html serão re-escritas para suas respectivas páginas em php.
RewriteRule (.)\.html 1.phpA instrução é composta basicamente por três expressões separadas por espaço:
01.
RewriteRule02.
^(.)+\.html$03.
$1.phpDesta forma, se for executada uma URL chamada teste.html será re-escrita e executada como teste.php.
Bem, para reforçarmos o assunto e ver na prática o seu funcionamento, será mostrado um exemplo simples de um sistema de notícias. Será abordado apenas as partes que irão auxiliar na exemplificação do problema.
Para tanto iremos criar quatro arquivos: UrlManage.class.php; Noticias.php; Noticia.php; e .htaccess. Faça o download dos arquivos.Primeiro iniciaremos pela classe UrlManage, que será utilizada para manipular todas as URLs.
<?
class UrlManage {
public static function getUrlNoticia($IdNoticia, $Categoria, $Titulo){
if( UrlManage::HabilitadoModRewrite() ){
return "noticia/$IdNoticia/".UrlManage::convertStringByUrlString($Categoria)."/".
UrlManage::convertStringByUrlString($Titulo).".html";
}else{
return "noticia.php?id=$IdNoticia";
}
}
private static function convertStringByUrlString($String){...}
private static function HabilitadoModRewrite(){
return true;
}
}
?>Na imagem (UrlManage.class.php) acima método principal é o getUrlNoticia(...), que retorna o link já formatado. Antes de retornar a string da URL é verificado, através do método HabilitadoModRewrite(), se a opção de re-escrita está habilitada ou não.
Este método tem a função de tornar fácil e sem maiores transtornos a possibilidade de adotar ou não a re-escrita de URL's, alterando simplesmente o valor booleano que é retornado.
O método convertStringByUrlString(...) é utilizado para limpar (remover espaços, caracteres especiais e etc) uma determinada string e torná-la apita para ser utilizada como URL.
A utilização da classe UrlManage é simples. Veja na figura (Noticias.php) abaixo.
<?
include("UrlManage.class.php");
//Essas informações normalmente virão de uma base de dados
$Noticias[0]["IdNoticia"] = 1;
$Noticias[0]["Categoria"] = "Categoria 01";
$Noticias[0]["Titulo"] = "Título da Notícia 01";
$Noticias[1]["IdNoticia"] = 2;
$Noticias[1]["Categoria"] = "Categoria 02";
$Noticias[1]["Titulo"] = "Título da Notícia 02";
//Criando uma lista com os links das notícias
print("<ul>");
foreach ($Noticias as $Noticia){
$link = UrlManage::getUrlNoticia($Noticia["IdNoticia"], $Noticia["Categoria"], $Noticia["Titulo"]);
print("<li><a href="".$link."">".$Noticia["Titulo"]."</a></li>");
}
print("</ul>");
?>Neste codigo é possível visualizar uma aplicação simples da classe UrlManage, que através de uma base de informações é criado uma lista de dados, contendo o título e o link para a respectiva notícia.
O resultado da execução do arquivo Noticias.php resultará nas seguintes informações, demonstradas na figura abaixo.
<!-- Resultado após compilação -->
<ul>
<li><a href='noticia/1/categoria-01/titulo-da-noticia-01.html'>Título da Notícia 01</a></li>
<li><a href='noticia/2/categoria-02/titulo-da-noticia-02.html'>Título da Notícia 02</a></li>
</ul>Veja que os resultados dos links estão estruturados para a utilização da re-escrita. O interessante é que em nenhum momento fica explicito qual a linguagem utilizada pelo site, nem como está definida a estrutura de diretório (original) e organização de arquivos do site, que por segurança torna-se uma vantagem. Agora basta codificarmos o .htaccess para interpretar a estrutura de URL definida.
Neste momento o importante é saber quais informações serão necessárias para a visualização da notícia. Pela estrutura que foi utilizada, para cada notícia existe um identificador, chamado de IdNoticia, que normalmente é representado por uma chave primaria e auto-incremental em um banco de dados. Então basta apenas saber o valor deste identificador, para que seja feito a recuperação das informações na página de exibição da notícia, que será a Noticia.php.
Então estruturaremos o .htaccess da seguinte forma:
RewriteEngine on
RewriteRule ^noticia\/([0-9]+)(\/[a-z0-9_-]+)?(\/[a-z0-9_-]+\.html)?$ Noticia.php?id=$1&categoria=$2&titulo=$3
Noticia.php?id=$1&categoria=$2&titulo=$3Verifique que a expressão regular utilizada na instrução atende a estrutura da URL. E que através do primeiro parâmetro, identificado como um numero de 0 a 9 maior ou igual a um dígito, representa o identificador necessário para a visualização da notícia e que será passado via GET através da variável "0id". E os outros parâmetros que identificam a categoria e o título da notícia podem vir ou não a ser usados.
Rapidamente, voltando ao assunto sobre Segurança citado anteriormente, é neste momento que é possível estruturar uma expressão regular que não deixe brechas para a inclusão de informações indevidas na URL. No caso do identificador da notícia (id), a expressão não possibilita a que um usuário tente inserir outras informações que não seja apenas números, se tentar fazer isto, a página não será encontrada, e irá dar o erro 404 de página não encontrada. Desta forma, conseqüentemente você já estará validando as informações vindas via URL, mantendo a integridade dos dados.
E por fim, veja na figura abaixo o código da página Noticia.php e na linha 9 o resultado da execução proveniente do clique no primeiro link da lista (resultado Noticias.php).
<?
$IdNoticia = $_GET["id"];
$Categoria = $_GET["categoria"];
$Titulo = $_GET["titulo"];
print "$IdNoticia # $Categoria # $Titulo";
//Resultado:
//1 # /categoria-01 # /titulo-da-noticia-01.html
?>Fique livre em estruturar a URL conforme suas necessidades, mas sempre lembre em tornar, com pequenos detalhes, suas URL's mais competitivas, seguras e agradáveis.
Neste artigo foram mostradas as vantagens de se utilizar URL Rewriting, juntamente com exemplos práticos da utilização do módulo Mod_Rewrite do servidor web Apache. Lembrando que é de extrema importância o estudo sobre Expressões Regulares, para a utilização correta deste recurso. Além do Apache é possível executar esta técnica em outros servidores web, como, por exemplo, no IIS (Internet Information Services) e também com outras linguagens como ASP .NET e Java. Mas isso é assunto para o próximo artigo, obrigado.
Apache
http://en.wikipedia.org/wiki/Rewrite_engine
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
http://www.allsyntax.com/tutorials/Apache/21/Mod_Rewrite-URLs-for-Search-Engines/1.php
IIS
http://www.qwerksoft.com/products/iisrewrite/
http://www.isapirewrite.com/
http://www.motobit.com/help/url-replacer-rewriter/iis-mod-rewrite.asp
http://cheeso.members.winisp.net/IIRF.aspx
ASP.NET
http://www.urlrewriting.net/en/Default.aspx
http://weblogs.asp.net/fmarguerie/archive/2004/11/18/265719.aspx
Java
http://www.zlatkovic.com/httpredirectfilter.en.html
http://tuckey.org/urlrewrite/
http://software.softeu.cz/rewriter/
Leandro Vieira
Olá Darley, parabéns pelo artigo e pela sua didática aqui aplicada. Um abraço e motiva-se a nova publicações.
Michael Carajeleascov
Darley, parabéns pela matéria, sempre me incomodaram as url's com as informações de consulta. Frequentemente vejo alguns sites com esse tipo de URL e nem imaginava como eram feitas, agora ja sei. Fiquei apenas com uma dúvida, para tralhar com ASP é só seguir o mesmo esquema, alterando as TAG's?
Bruno Gasparetto
A explicação foi muito boa e ainda forneceu um belo material de consulta.
No entanto, segundo a Apache, é melhor utilizar as regras de rewriting no próprio arquivo de configuração, estipulando o diretório que receberá a regra.
Isto porque ao configurar o servidor para utilizar arquivos .httaccess a performance diminui, devido ao fato dele ter de procurar em todas as pastas e subpastas este arquivo.
Michael, o esquema é o mesmo, a diferença é que ao invés de chamar um arquivo .php vc utilizara o .asp.
Darley Passarin
Bem, primeiro obrigado pelos parabéns e fico feliz de terem gostado. Michael, como mencionado no texto, esta tecnologia é configurada no servidor web, desta forma, para que você possa aplicá-la com o ASP, será necessário configurar o IIS (porque o apache não roda ASP nativamente %u2013 veja uma solução para isto http://www.apache-asp.com/), cujo assunto será abordado em meus próximos artigos.
Quanto a configuração direto no http.conf para melhorar a performance, o Sr. Bruno está correto, na documentação do Apache é mencionado tal afirmação. Mas mesmo assim, para a maioria dos desenvolvedores que possuem seus sites armazenados em servidores de hospedagem, não possuindo acesso ao arquivo http.conf, está opção (.htaccess), descrita no artigo, é a melhor possível.
Estarei disponível para responder qualquer dúvida, obrigado.
Ricardo Benfica
tentei fazer o cod de varias maneiras para uma pagina assim www.meusite.com/artigos.php?id=1
ser www.meusite.com/artigos/1
alguem pode me dar uma ajuda? pedi ao host q liberasse o mod_rewrite..segundo eles foi liberado
Heloisa Fernanda
Olá, não consegui fazer download dos exemplos. O link esta quebrado e sendo redirecionado para a página principal.
Deni Carlos Gomes Augusto
Parabéns pela matéria - Uma das melhores que ja li aki no Imasters sobre php. Um grande abraço pra você.
Darley Passarin
Pessoal, para aqueles que não conseguiram baixar os arquivos utilizados no artigo, utilize a url http://www.darley.com.br/imasters/urlrewriting_exemplos.zip para baixá-los. Obrigado.
Darley Passarin
Ricardo Benfica, mesmo já tendo respondido sua dúvida por email, estarei mostrando a solução para seu problema, para que outras pessoas possam tirar suas dúvidas. Para tanto, crie um arquivo chamado .htaccess o coloque as seguintes instruções: RewriteEngine on RewriteRule ^artigos\/([0-9] )?$ artigos.php?id=$1 . Devido que neste campo de comentário não é possível quebrar linha, lembre-se que a instrução RewriteRule deve ficar na linha abaixo da "RewriteEngine on". O segredo está na expressão regular, para isso é necessário ter conhecimento no assunto. Qualquer dúvida entre em contato.
Danilo Faustinoni Cabello
Não tive oportunidade ainda para testar, mas uma coisa que me intrigou é a falta de asterisco nas suas expressões como: RewriteRule (.)\.html $1.php precisa de um asterisco para ele redirecionar por exemplo teste.html para teste.php, certo?
E no caso de [0-9] teria que haver [0-9]{1,}?
Não quis parecer arrogante nem nada, gostaria apenas de saber se há alguma diferença especial nas regex do apache.
Vlw, abraço!
Darley Passarin
Olá Danilo Faustinoni Cabello, obrigado pelas observações, que estão corretas, por que na verdade alguns caracteres não apareceram após a publicação na internet. Desta forma, enquanto entro em contato para efetuarem estas correções, estou disponibilizando para download (http://www.darley.com.br/imasters/darley_passarin_url_rewriting.pdf) o arquivo original do artigo. Obrigado.
vinicius gallafrio
Ola Darley, estou usando o IE 7 e os layers dos trechos de codigo ficam sobre o texto, o que prejudica a leitura do seu artigo. Por favor repasse essa info pra os tecnicos do site e me desculpe por usar esse espaço para isso, mas é que não encontrei outro local.... abraco
Darley Passarin
Olá Vinicius Gallafrio, a sua observação já foi informada à equipe técnica. Enquanto isso utilize o Firefox, por que além de não possuir este problema, todos os códigos ficam identados corretamente. Obrigado.
paulo pereira
Darley gostaria que você me ajudasse com o httpd... no meu arquivo não existe a linha "AddModule mod_rewrite.c" e quando eu adiciono ela ao arquivo da um erro do apache quando reiniciado.
Uso o apache 2.0.59
obrigado
juarez alencar
Olá Darley, muito interessante sua materia, semçre quis saber como fazer esse tipo de configuração em PHP, esse padrão utilizado pelo imasters nas suas URLs é muito legal, agora já sei o caminho das pedras e só tenho a agradecer.
Darley Passarin
Olá Pessoal, conforme algumas dúvidas expressas por alguns usuários, referente à configuração do Apache na versão 2.2, segue algumas instruções para esta configuração: Primeiro, remova o # da linha "LoadModule rewrite_module modules/mod_rewrite.so";
Segundo, em todas as linhas que tiver a seguinte expressão "AllowOverride None", substitua por "AllowOverride All"; Terceiro, reinicie o Apache e aproveite. Abraços...
Écio Virgílio
Ótima didática, excelente tema, Parabéns. Acho que o melhor artigo que jah li aqui no IMASTERS.
Fernando Santana Medrado
Parabéns pelo artigo, vc conseguiu simplificar um assunto bem complexo...
E pra galera que tá começando nisso (como eu), aí vai um link de uma ferramenta q ajuda muito... flw.
http://www.mod-rewrite-wizard.com/
Tellys Castro
no apache 1,3,27 nao funcionoiu, pq sera... no 2.2 fucniona...
Bruno Trazzini
Options FollowSymLinks
RewriteEngine on
RewriteRule ^([0-9] \.html)?$ post.php?id=$1
Marcos Ferreira
Darley eu peguei estes exemplos e excutei no meu apache, quanto pesso para o arquivo noticia.php resgatar as variáveis ele nã resgata, porque? Eu joguei no servidor da locaweb também a mesma coisa, não funcionou. Me ajuda por favorrrrr
Xavier Klausener
Olá,
estou tentando converter a url: /produtos/120_nome_do_produto para /produto?cod=120.
Como faço isso?
Valeu!
Michel Borges
Olá Pessoal estou a com a seguinte dúvida, coloquei o quero transformar a seguinte URL:
http://localhost/br/moveis/produto.php?cdproduto=3
Tranformar em:
http://localhost/br/moveis/produto/3
meu .htacess está dentro do diretorio localhost/br/moveis e está desta forma:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.html$ /$1.php?cdproduto=$2
Não está funcionando, já tentei de tudo li em um monte de sites mas nada acontece. Estou desesperado já. Abraço.
Muito Obrigado.
Marcelo Vinicius
Deveria existir um manual desse com ASP, nunca vi, pois o que não falta é em PHP
Darley Passarin
Marcelo, dá uma olhada no artigo http://imasters.uol.com.br/artigo/5475/programacao/url_rewriting_no_iis_com_asp_aspnet_ou_php/
Éwerton Cardoso
Darley parabens pelo artigo. Fiz aqui e deu certo, porém a pagina da noticia (http://www.maisdesenvolvimento.com.br/exemplo/noticia/1/categoria-01/titulo-da-noticia-01.html) não aparece imagen. Vc saberia me falar por que??
Coloquei os arquivos em www.maisdesenvolvimento.com.br/exemplos/
Obrigado!!
Darley Passarin
Olá Éwerton, para funcionar você terá que colocar /logo.png, ou seja, antes da imagem você tem que colocar o endereço completo da localização da imagem, por exemplo, se essa imagem estivesse dentro de uma pasta imagens, o endereço deveria ser /images/logo.phg. O / no inicio é fundamental para funcionar.
Éwerton Cardoso
Olá Darley, obrigado por responder. Fiz o que vc disse (coloquei o caminho completo) e não deu certo, o mesmo acontence para o css. Quando se acessa o arquivo noticia.php as imagens e o css aparecem normalmente, mas quando a url é reescrita (.../exemplo/noticia/1/categoria-01/titulo-da-noticia-01.html) não aparece. Será que tem algo a ver com o httpd.conf? Pois no meu httpd.conf não tem a linha AddModule mod_rewrite.c, ele tem só a linha LoadModule rewrite_module modules/mod_rewrite.so que descomentei tudo como foi indicado no tutorial.
Obrigado!
Éwerton Cardoso
Agora sim deu certo.. só agora fui entender o que disse. .rsrsr.. coloquei o caminho completo (http://www.maisdesenvolvimento.com.br/exemplo/estilos.css) e deu certo..
Muitiiiiiiisssimmmoooo obrigado!!
Marcelo Benevides
Estou com uma dificuldade em fazer com que o visitante retorne para a pagina inicial estando lendo uma noticia.
Uma segunda dificuldade, é no momento da leitura de uma noticia, o visitante clicar em uma outra noticia fica meio estranho a url e da 404.
Link que a classe gera:
/noticia/7/esporte.html/noticia/1/politica.html
Note que fica repetido a url atual e escrita a nova url para a qual o visitante deseja ir.
Como posso corrigir esta questão?
Darley Passarin
Marcelo, tente colocar uma / antes do index.html, ficando /index.html, desta forma, independente da página que ele esteja, ele será redirecionado para a página index no root do site.
Marcelo Benevides
Deu certo aqui a questão da / antes do index perfeito.
Porem ainda tenho uma duvida:
Link que a classe gera:
/noticia/7/esporte.html/noticia/1/politica.html
Preciso que ela gere links independentes
Ja tentei uma serie de codigos e nenhum funcionou.
tentei $_server, $request dentro da classe e fora dela, tentei tambem utilizar o RewriteBase
porem as tentativas foram frustradas.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.