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:

Este post tem 20 comentários

  1. cara, to com uma dúvida que ainda nao consegui a resposta, to começando agora a ver url amigável, por isso to todo enrolado.

    é o seguinte, to desenvolvendo um site que vai ter uma pequena lista de notícias que abririam em notícia.php, to lutando e ainda nao consegui fazer a url amigável, gostaria que ficasse http://www.meusite.com.br/noticia/ano/mes/titulo.

    e também as outras páginas gostaria de transformar todas em url amigável, o código é

    RewriteRule ^home$ index.php
    RewriteRule ^quem-sou$ quem-sou.php
    RewriteRUle ^solucoes$ solucoes.php
    RewriteRule ^portifolio$ portifolio.php
    RewriteRule ^contato$ contato.php

    mas sempre que coloco alguma coisa como o que você colocou acima da erro e ele não entra em mais nenhuma página dessas.

    gostaria da sua ajuda, creio que são erros primários, mas to aprendendo agora….

    1. Olá Ronaldo, revisei o código e percebi que o editor havia acrescentado alguns espaços em branco que não existiam, corrigi estes detalhes.
      Bom, primeiro verifique se o mod_rewrite esta ativo na config de seu apache, ele é um módulo responsável pela a reescrita transparente de URLs usando expressões regulares.
      deve haver a linha: RewriteEngine On
      Segundo, no RewriteRule você deve usar expressões regulares para definir as regras de sua URL.
      Paciência é a melhor virtude do aprendiz!
      😉

      1. o mod_rewrite já está ativo, coloquei aquela parte do código para mostrar quais são as páginas, não gostaria de trabalhar com includes, por isso criei um RewriteRule para cada página, tem alguma outra forma de fazer isso?

        e no caso de um sistema de notícias, passando o ano/mes/titulo da notícia?

  2. Esses caras nunca nos ensinam a fazer como a dúvida do @Fernando.


    Como fazer url assim?

    Minha url esta assim:
    http://www.meusite.com.br/index.php?cid=cascavel?&id=15

    Gostaria dela desta forma:
    http://www.meusite.com.br/cascavel/atual/cabelos-lindos-como-nunca-66-off-em-cauterizacao-reconstrucao-de-fios-escova-pe-ou-mao

    Sendo que o texto:cabelos-lindos-como-nunca-66-off-em-cauterizacao-reconstrucao-de-fios-escova-pe-ou-mao é o titulo da oferta id=15

    como fazer isso, pois tenho acessar o BD?

    Leia mais em: http://rotinadigital.net/wordpress/urls/#ixzz1qvfWLvNi
    Under Creative Commons License: Attribution Non-Commercial
    “.

    Só sabem copiar tutoriais por aí e nem sequer estudam o que querem ensinar

    1. Sim, a URL por si (amigável ou comum) só é uma consulta ao BD, o que temos que fazer é montar uma expressão regular que vai receber os parâmetros da consulta e passar para seu script em forma de query, isso ocorre na linha RewriteRule, Ok?
      Você terá que tratar a string “abelos-lindos-como-nunca-66-off-em-cauterizacao-reconstrucao-de-fios-escova-pe-ou-mao” para chamar provavelmente o campo título em seu BD.
      No seu exemplo existem três parâmetros do tipo string: “cascavel”, “atual” e o título, o RewriteRule ficaria mais ou menos assim: ([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?cid=$1?&id=$2&titulo=$3
      Não sou expert em URL amigáveis mas conseguir trabalhar com elas, e sim tive que estudar bastante para isso, se tiver mais alguma duvida pode perguntar, se eu souber a resposta terei prazer em responder, porém os comentários estão abertos para qualquer pessoa que queira contribuir.
      T+..

  3. Usando o estilo Twitter, há alguma maneira de forçar o final da url ser sempre com / ?

    1. Sim, basta adicionar a barra antes de fechar a expressão regular “/$”, porém você pode ter problemas casso ajam diretórios a serem acessados no servidor, pois a barra no final é indicação de diretório.

  4. Tem como trabalhar com 1 e 2 parâmetros consecutivos. Por exemplo. Tenho uma página que chamará quem-somos apenas buscando o texto na tabela quem-somos. E também um outro tipo onde teremos como parâmetro por exemplo ID:3 e apto:32
    Existe essa possibilidade?

    1. Olá Thiago, vc pode trabalhar com o número de parâmetros que quiser, basta adaptar sua expressão regular às variáveis de sua URL padrão.

  5. Olá Ivanilton, até que fim consegui entender um pouco url amigavel, vlw !!!
    uma duvida quanto ao desempenho do site e a segurança do uso de .htaccess, o que vc sabe nos passar sobre isso? há perdas o perigo?
    grato

    1. Oi, amigão, se comentário tava aguardando moderação. Bem, não há perda de desempenho e a segurança é melhorada, pois os visitantes não tomam conhecimento da tecnologia por trás de seu site.

  6. nao estou achando o comentario q deixei há pouco, vc ivanilton excluiu?

  7. Muito bom.
    Isto explica muita coisa q tinha dúvidas.
    Valeu pelo post cara!

Deixe o seu comentário:

Fechar Menu
%d blogueiros gostam disto: