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. 

Tags do texto:

Participe pelo Facebook:

10 Comentários - Deixe o seu !

  1. Wagner disse:
    MAS CARA ISSO AÍ NÃO ME AJUDOU EM NADA PQ É SÓ PRA SISTEMA DE USUÁRIOS E NÃO PRA NOTÍCIAS

    VC DISSE QUE http://exemplo.com/loja/cgi-bin/index.php?id=66754&produto=456&page=6

    Poderia ficar assim:

    http://exemplo.com/loja/meuproduto

    E NÃO COLOCOU A FORMA DE TRANSFORMAR OS NÚMEROS (ID) EM UM NOME (MEUPRODUTO) CARA ME AJUDA POR FAVOR ME RESPONDE POR EMAIL!

  2. Ronaldo disse:
    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….

    • 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! ;-)
  3. Fernando disse:
    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?

  4. Luis Alves disse:
    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

    • 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+..

Deixe uma resposta