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
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 |
//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
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 |
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'); } |
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 '', ) |
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 |
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:
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!
Olá Wagner, me explica em qual parte esta sua dificuldade?
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!
😉
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?
Dá uma olhadinha aqui, espero que ajude.
abs.
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?
Amigos tambem to tentando transformar:
http://www.meusite.com/portal/?pg=noticia&id=1074
em:
http://www.meusite.com/portal/noticia/titulo-completo-da-noticia.html
tem como?
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+..
Usando o estilo Twitter, há alguma maneira de forçar o final da url ser sempre com / ?
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.
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?
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.
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
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.
nao estou achando o comentario q deixei há pouco, vc ivanilton excluiu?
Muito bom.
Isto explica muita coisa q tinha dúvidas.
Valeu pelo post cara!
Meu me perdi um pouco no código.
Estou tentando fazer o seguinte:
meusite.com.br/email1@email
meusite.com.br/email2@email
Dai tem que redirecionar para a pagina que exibe as info do email. Pode dar uma luz ae?
Pesquisa um pouco sobre expressões regulares