quinta-feira, 20 de dezembro de 2007

URLs Amigáveis com Apache e PHP

Nesse artigo veremos como implementar URL’s mais amigáveis para as pessoas acessarem nosso site, sem o “trauma” de ver “códigos esquisitos” na barra de endereço do browser.

Outra motivação de implementarmos as URL’s amigáveis em nossos sites, é para sermos rastreáveis por spiders que normalmente ignoram arquivos com extensão que denotam programas que retornam conteúdo variável.

Essa técnica que passaremos aqui ajuda a destacar nosso site em sites de busca como o Google ou Yahoo e é uma ferramenta da SEO (Search Engine Optimization).

Se você não está entendendo direito o que estou dizendo vamos para um exemplo. Imagine que tenhamos um site que mostra artigos e informações sobre seus autores. Sem a utilização das URL’s amigáveis, poderíamos acessar um artigo da seguinte maneira:

http://www.sitedeartigos.com.br/artigo.php?id=123

Agora, utilizando a técnica que será passada por esse artigo, poderíamos acessar nosso site da seguinte maneira:

http://www.sitedeartigos.com.br/artigo/123

A URL acima é muito mais interessante de se ler do que a primeira URL informada. Creio que com esse simples exemplo, podemos entender qual o benefício que obteremos após aprendermos essa técnica.


Configuração do Apache
Como tudo na nossa área de programação, há várias
maneiras de se atingir um mesmo objetivo. Utilizarei uma técnica que desviará
qualquer chamada para o arquivo index.php que será o nosso manipulador de
requisições. Portanto, tudo passará pelo index.php e ele será o responsável por
carregar os arquivos corretamente.

A versão do Apache que estou utilizando é a 2.2.4.


1) Vá até o arquivo httpd.conf e descomente a linha
# LoadModule rewrite_module modules/mod_rewrite.so
Para descomentar, basta retirar o símbolo de cerquilha na frente da linha.
Essa alteração nos permitirá manipular as requisições, redirecionando-as para o arquivo index.php

2) Ainda no arquivo httpd.conf, localize a linha onde há a diretiva <Directory /> e garanta que tenha a seguinte linha dentro da diretiva: AllowOverride All.
Essa alteração nos permitirá utilizar o arquivo
.htaccess.

3)Reinicie o serviço do Apache


Configuração do arquivo .htaccess
Para nosso exemplo, vamos assumir que o site será testado dentro do diretório thiagomp que por sua vez tem o diretório teste.
Dentro do diretório teste ficará nossos arquivos PHP, inclusive o arquivo
index.php.
Portanto, nossa URL base seria http://localhost/thiagomp/teste.
Para funcionar o esquema, crie um arquivo chamado .htaccess (repare que há um ponto antes do nome do arquivo...) com o seguinte conteúdo:

RewriteEngine on
RewriteRule .* index.php
php_flag magic_quotes_gpc off
php_flag register_globals off

Repare que ligamos o motor de reescrita com a primeira linha e depois implementamos a regra de redirecionamento. A regra é bem simples: qualquer coisa que for informada, deve ser redirecionada para o arquivo index.php.

As outras duas opções nem seriam tão necessárias, mas são ótimas para garantir segurança e a sanidade de nossos códigos.

O arquivo .htaccess deve ser salvo dentro do diretório teste.


Arquivos para o teste
Abaixo será mostrado os arquivos utilizados para o testes com comentários. Tais arquivos foram testados com o PHP versão 5.2.4.

artigo.php

<?php
$idArtigo = isset($parameter['id']) ? $parameter['id'] : 0;
if(empty($idArtigo)){
  echo "<h2>Não foi selecionado o ID do artigo</h2>";
}else{
  echo "<h2>Mostra o artigo de ID $idArtigo</h2>";
}

autor.php
<?php
$idAutor = isset($parameter['id']) ? $parameter['id'] : 0;
if(empty($idAutor)){
  echo "<h2>Não foi selecionado o ID do autor</h2>";
}else{
  echo "<h2>Mostra informações do autor de ID $idAutor</h2>";
}


naoencontrada.php
<?php
echo "<h2>Página não encontrada</h2>";

index.php
<?php
/**
 * Recupera a URL solicitada e quebra cada parte dela.
 * Portanto, se a URL for algo do tipo http://localhost/thiagomp/teste/artigo/10 obteremos o seguinte array:
 * array(5) {
 *  [0]=>  string(0) ""
 *  [1]=>  string(6) "thiagomp"
 *  [2]=>  string(12) "teste"
 *  [3]=>  string(6) "artigo"
 *  [4]=>  string(1) "10"
 * }
 *
 * Com isso poderíamos convencionar que em nosso site, tudo o que vier depois da URL base, primeiro virá o nome do arquivo que vamos invocar e depois os parametros, sendo que primeiro parametro será sempre um ID
 */


$parts explode('/'$_SERVER['REQUEST_URI']);

/**
 * Esse trecho testa quantos diretórios há na URL solicitada. Dependendo da quantidade de diretórios passados, nosso programa ajustará os valores que serão procurados nas páginas invocadas
 */
if(count($parts) == 5){ // o usuário informou uma pagina e um ID
  $params array_slice($parts, -2);
  $pagina $params[0];
  $id $params[1];
}elseif(count($parts) == 4){ //o usuário informou apenas a pagina
  $params array_slice($parts, -1);
  $pagina $params[0];
  $id 0;
}else{ // nada foi informado
  $pagina "nenhuma";
  $id 0;
}

switch ($pagina){ //seleciona a página
  
case 'artigo'// implementamos o que queremos fazer quando uma determinada página for encontrada...
    $parameter[
'id'] = $id// configura o parametro que será recuperado na $pagina.php
    include("$pagina.php"); //... nesse caso vamos incluir o arquivo para execução
    break;
  case 'autor'
//idem ao artigo
    
$parameter[
'id'] = $id;
    include("$pagina.php");
    break;
  default: 
//caso a página solicitada não exista, mostraremos um erro
    
include('naoencontrada.php');
}


Depois de copiar os conteúdos e gravá-los em
arquivos, basta efetuarmos um teste colocando no browser a URL http://localhost/thiagomp/teste/artigo/10

Espero que esse artigo seja útil para lhe dar uma
noção sobre o funcionamento das URL’s amigáveis. Com certeza é um exemplo muito
simples, porém, para quem está iniciando, será muito bom para compreender o
conceito e continuar o desenvolvimento dos conhecimentos nessa área.

Caso algum erro ocorra com os arquivos ou tenha algo
para acrescentar, fique a vontade de comentar.

Até o próximo post.