Como criar URL amigável com PHP e .htaccess

Veja como criar uma URL amigável e entenda como ela pode contribuir para um melhor posicionamento nos motores de busca (SEO).

Como o próprio nome diz, as URLs amigáveis 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, veja 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ável estilo Flickr

URL amigável 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ável estilo Twitter

URL amigável 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. 

URL amigável e SEO

Junto ao título, meta-descrição e o conteúdo em si, os mecanismos de pesquisa usam o URL da página para entender do que se trata seu assunto.

Na verdade, os URLs são tão importantes que o próprio Guia de otimização de mecanismos de pesquisa (SEO) para iniciantes do Google dedica uma seção inteira a elas:

URLs amigáveis e SEO

Gostou dessa matéria?

Inscreva seu email para receber atualizações com as últimas publicações do nosso blog.
[jetpack_subscription_form show_subscribers_total="false" button_on_newline="false" custom_font_size="16px" custom_border_radius="0" custom_border_weight="1" custom_padding="15" custom_spacing="10" submit_button_classes="" email_field_classes="" show_only_email_and_button="true" success_message="Sucesso! Enviamos um e-mail para confirmar a sua assinatura. Encontre o e-mail agora e clique em 'Confirmar' para iniciar a inscrição."]

21 opinaram!

Deixe sua opinião!
  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….

    • 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!
      😉

  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: https://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+..

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

  3. 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?

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

One Ping

  1. Pingback:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *