Front End

5 fev, 2007

URL Rewriting: Criando URLs competitivas!

Publicidade

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.

O que é? E quais os benefícios?

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:

  • Facilita a indexação de informações por motores de buscas;
  • Torna a URL mais agradável e de fácil compreensão por nós humanos;
  • E Segurança, evitando problemas como SQL Injection.

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.

Primeiros passos na prática

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.

Alterando o arquivo de configuração

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.c
Localize 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.

Criando e manipulando o .htaccess

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 On

Este 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.php

A instrução é composta basicamente por três expressões separadas por espaço:

01.

RewriteRule

É a expressão que inicia uma linha de instrução.

02.

^(.)+\.html$

É a expressão regular que identifica a página que deverá ser filtrada. Neste momento é muito importante ter conhecimentos sobre expressões regulares, desta forma, é preciso que você consulte outras fontes sobre assunto.

03.

$1.php

Está é a URL original que será executada. Veja que existe a seguinte expressão 1, esta representa o primeiro parâmetro filtrado pela expressão regular. Os parâmetros são definidos pelos conteúdos que atendem a expressão entre (), caso exista mais de um par de (), os próximos parâmetros serão representados como 2, 3, 4…

Desta forma, se for executada uma URL chamada teste.html será re-escrita e executada como teste.php.

Exemplo Prático

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=$3

Verifique 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.

Conclusão

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.

Referências

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/