Criando URLs amigáveis com .htaccess e PHP

URLs amigáveis contribuem para um melhor posicionamento nos motores de busca, e como o próprio nome diz são mais fáceis de serem assimiladas pelos usuários, as pessoas  já podem ter uma noção do assunto da página simplesmente lendo seu endereço, vejam um exemplo:

Essa URL:

http://exemplo.com/index.php?&produto=456&page=6

Poderia ficar assim:

http://exemplo.com/nome-do-produto/6

Neste post vamos explicar sobre técnicas de reescrita de URLs usando o módulo mod_rewrite e o arquivos .htaccess no servidor apache. Esse tutorial foi escrito originalmente por Srinivas Tamada de 9lessons com dois tipos de URLs amigáveis com base no Flickr e Twitter.

URL amigáveis estilo Flickr

Observamos que existem dois parâmetros: “id=polvero” e “page=2” para alcançar este resultado, vamos adicionar o seguinte código em o nosso .htaccess:

//usando URL com um parâmetro (tipo string)
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ users.php?user=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ users.php?user=$1
 
//usando URL com dois parâmetros (uma string e um int)
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ users.php?user=$1&page=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/$ users.php?user=$1&page=$2

URL Original

http://flickr.com/users.php?id=username&page=2

URL amigável

http://flickr.com/username/2

No exemplo acima estaremos recebendo uma string e um numero como parâmetros, se quiser usar apenas palavras repita a expressão “^([a-zA-Z0-9_-]+)”  separada por barras “/” para especificar suas variáveis.

Nota: É possível adicionar facilmente extensões ao final de nossas URL amigáveis, por exemplo:

http://exemplo.com/loja/meuproduto.html

Basta acrescentar a extensão no final da expressão regular, veja:
^([a-zA-Z0-9_-]+)/([0-9]+)/$  ficaria ^([a-zA-Z0-9_-]+).html$

 

URL amigáveis estilo Twitter

Olhando a imagem, percebemos que não pode haver um usuário “login”, “home” ou “terms”, isto é possível através de um filtro com palavras reservadas no momento da inscrição, para atingir o objetivo vamos combinar um pouco de PHP com o nosso .htaccess.

Código .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?key=$1 
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?key=$1

Código PHP (index.php)

switch($_GET['key'])
{
case 'home': include('home.php');break;
case 'login': include('login.php');break;
case 'terms': include('terms.php');break;
case 'users':include('users.php');breaak;
default: include('404.php');
}

O principio básico para criação de uma URL amigável é montar a expressão regular que vai receber o parâmetros passado pela URL e repassar para o endereço real do script PHP que estará especificado dentro do .htaccess, de começo pode parecer meio complicado, mas depois que você pegar “as manhas” verá que não é tão difícil assim.

RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/$ users.php?user=$1&page=$2

É importante observar que todos os parâmetros necessários para  realizar a consulta devem ser passados para seu script, vamos olhar novamente o exemplo do começo do artigo:

http://exemplo.com/loja/cgi-bin/index.php?produto=456&page=6

Para chegar no resultado esperado, nos teremos que passar os dois parâmetros (produto e page) dentro da URL, para poder fazer as coisas funcionarem corretamente.

Se você tiver a possibilidade de fazer modificações na estrutura do banco de dados, então podemos considerar a possibilidade de criação de um novo campo exclusivamente para guardar uma variável associada a nossa URL amigável:

CREATE TABLE IF NOT EXISTS `Produtos` (
`fieldID` BIGINT(32) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`Quantidade` BIGINT(32) NOT NULL,
`Nome` VARCHAR(255) NOT NULL DEFAULT '',
`Descricao` VARCHAR(255) NOT NULL DEFAULT '',
`slug` VARCHAR(255) NOT NULL DEFAULT '',
 
)

Assim, agora também podemos consultar o produto pelo campo slug:

http://exemplo.com/index.php?slug=nome-do-produto

.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?slug=$1

O resultado:

http://exemplo.com/nome-do-produto

Dica: É importante sempre usar os comandos RewriteCond %{REQUEST_FILENAME} !-f  e RewriteCond %{REQUEST_FILENAME} !-d, eles servem para evitar que as regras sejam aplicadas caso existam arquivos ou diretórios reais, com nomes iguais aos solicitados pela URL amigável. 

Compartilhe Também:

Comentários(18)

Deixe seu comentário