Para quem não sabe o que é URL amigável vou explicar através de exemplo para evitar dúvidas.
URL Convencional: http://www.exemplodominio.com.br/noticia.php?id=1237
URL Amigável: http://www.exemplodominio.com.br/noticia/1237/
Viu a diferença? Além da vantagem de ficar mais elegante, facilita bastante a indexação dos mecanismos de buscas. Mas como fazer o controle de arquivos e identificadores? Então vamos aos códigos.
Primeiro você deve editar ou criar um arquivo .htaccess na raiz do seu site e inserir o código abaixo.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^([^-]+)/$ /funcao.php?frase=$1&%{QUERY_STRING} [L]
A primeira linha linha é para ativar o módulo. A segunda e terceira linha é para ignorar arquivos e diretorios respectivamente. Na quarta linha ignora alguns tipos de arquivos. E finalmente na quinta linha, joga a string para um arquivo php qualquer, neste caso funcao.php.
$geturl = explode('/', $_SERVER['REQUEST_URI']);
if ($geturl[1] == 'noticia') {
$id = $geturl[2];
include noticia.php;
}
Interpretando rapidamente o código, a linha inicial captura a variavel gerada pela URL e usa a função explode para separar as palavras da URL.
Em seguida eu faço uma condicional IF para verificar se é noticia e setar o ID da mesma. Você pode incrementar como quiser o código e ter quantas palavras desejar na URL. Basta ter um pouco de criatividade.
Lembre-se, para funcionar o módulo apache Rewrite deve estar ativo no servidor Apache. Para maiores informações, procure a empresa de hospedagem do seu site.
91 comments
Diogo.
Parabéns pelo tutorial… funcionou certinho….
Eu tenho uma dúvida, depois que funcionou, todos as imagens e links tem q ser renomeados, pois eles aparecem estar em níveis diferentes do que estavam?
Por ex, a partir de agora tenho q colocar ou o caminho inteiro do site para pegar o css, ou mudar os níveis nos arquivos?
É assim mesmo??
Obrigado!!
amigos como faco pra transformar atraves do .htaccess as urls
http://www.meusite.com/portal/?pg=noticia&id=1081
em:
http://www.meusite.com/portal/noticia/1081/titulo-completo-da-noticia.html
fico no aguardo…
Mario, é so usar a TAG BASE, que resolve o problema da “relatividade” dos links
Genarks, é justamente isso que explica no post! ;)
Diogo ou seja, eu iria inserir o titulo do artigo no banco
no momento de carregar eu iria buscar nesse campo do banco ?
Exemplo
meusite.com.br/artigo/123 -> vou pesquisar o artigo de ID = 123
alterando para o título
meusite.com.br/artigo/flamengo-fraco -> vou pesquisar no banco no “campo” url onde tem flamengo fraco
é isso ou estou querendo inventar ?
o certo é voce fazer com um ID.. mas da pra fazer com o titulo tb..
Diogo,
Fiz um httpacess igual ao do post. Acessando “site.com/noticia/testedenoticia.htm” dá certo,
mas se acessar “site.com/noticia/teste-de-noticia.htm” da erro: “The requested URL /noticia/teste-de-noticia.htm/ was not found on this server.”
Os traços estão dando erro.. pq?
Os arquivos estão iguaizinhos aos do post, será que é um problema no meu servidor ou tem alguma solução pro httpacess ?
o erro é na expressão regular, é so colocar o hifen nela! :)
Diogo,
Valew cara. Consegui resolver trocando o ([^-]+) por (.*)
Ficando assim:
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^(.*)/$ /funcao.php?frase=$1&%{QUERY_STRING} [L]
Usando o (.*) acha que posso vir a ter algum tipo de problema que eu ainda não saiba ???
Cara você não explicou que isso aí teria que usar caminho absoluto!!! Tem alguma forma de fazer sem caminho absoluto?
Bobagem ninguém vai decorar o id da postagem deixa como está , poucas pessoas olham as urls
Julho, isso não é pra decorar ID, e sim para ficar mais organico para os buscadores
Luis, voce deve usar a meta tag HEAD para isso.
[…] peço que se informe melhor sobre esta técnica, recomendo alguns blogs: MestreSEO, Thiago Belem, Dourado (inspiração para o meu tutorial) e Bruno […]
aqui tá dando erro 500.
vi que pode ser a permissão do arquivo .htaccess, mas como posso mudar a permissão em localhost? uso wamp server…
voce acha que isso funcionaria tbm?
# Apache Rewrite Rules
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
# Add trailing slash to url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
RewriteRule ^(.*)$ $1/ [R=301,L]
# Remove .php-extension from url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^\.]+)/$ $1.php
# End of Apache Rewrite Rules
nao consigo usar isso porque provavelmente esta desativado em meu servidor o mod_rewrite e a pasta dele esta oculta.
Como vai, tudo blz?
Preciso retirar alguns caracteres da minha url, é possível fazer isso via .htaccess?
Consigo acessar meu site assim:
http://www.meusite.com.br/categoria e http://www.meusite.com.br/#!/categoria quero retirar o #! alguém pode ajudar?
So funciona como mod_rewrite ligado
Jean, provavelmente nao é permissao, e sim sintaxe errada, da uma verificada
Diogo, muito bom artigo. Usando com MVC fica show de bola, parabéns.
Tenho um problema com minhas imagens e scripts..
Quando utilizo a URL amigável todas as imagens e scripts deixam de funcionar! =/
Saudações amigos,
Estou precisando de uma ajuda que pra mim tá parecendo um bicho de 7 cabeças, mas pra vcs deve ser simples, é o seguinte:
eu tenho um domínio http://www.e-therapy.com.br redirecionando para o endereço: http://www.e-therapy.sociedadedespertalista.org.br
quero fazer uma URL amigável para que após o redirecionamento a url mostrada no endereço do navegador seja a menor.
Como seria isso?
Desde já obrigado.
David, você esta confundindo as coisas. O que você quer é reduzir o dominio, para isso deverá registrar um nome menor, ok?
Daniel, isso é facil de resolver. É porque os caminhos das imagens estão relativas, por isso o usuario “não acha” as imagens atraves das novas URLs. Para isso você deve utilizar a meta “base”, que serve para referenciar a partir de onde os caminhos relativos irão se iniciar. Veja mais em: http://www.w3schools.com/tags/tag_base.asp … qualquer dúvida, é so dizer! :)
Muito bom, parabéns ao criador do post.
Tava precisando disso pra desenvolver um Portal de Notícias, procurei em vários sites mas não entendi, mas neste post consegui fazer!! :D
David, não sou familiarizado com provedores, mas acredito que na hospedagem você possa fazer isso, utilizar a url menor e fazer com que a url maior seja redirecionada para a menor, ou seja, é só inverter as bolas.
tenho uma url da seguinte forma /verartigos.php?id-10
ok, usei da seguinte forma…
RewriteEngine On
RewriteRule ^artigos\/?([0-9]+)\/?$ verartigos.php?id=$1
deu certo em partes mais agora o site perdeu toda configuração de layout etc
preciso também desta forma exemplo, / depoimentos.php para /depoimentos apenas…
Segui o tutorial e não deu certo.
Não dá pra compreender muito bem, tá mal elaborado o tutorial.
Reinaldo, envie sua dúvida e obrigado pela crítica.
Oi Diogo, muito bom o tutorial, mas estou tendo alguns problemas: eu tenho menus que podem ou não conter submenus e que são acrescidos ou terem suas ordens alteradas via admin e as páginas são geradas através de urls com o formato http://www.meusite.com.br/secao.php?s=1&aid=1 ou http://www.meusite.com.br/secao.php?s=4 e formato que estou tentando é http://www.meusite.com.br/quem-somos/fulano-de-tal ou http://www.meusite.com.br/imprensa/. Eu até consegui fazer funcionar com o RewriteRule, mas somente se especificar os endereços (RewriteRule ^quem-somos/fulano-de-tal/?$ /secao.php?s=1&aid=1 [NC]), e isso não é nada prático. Pode me ajudar?
Olá.
O .htaccess do meu site tá configurado exatamente assim, conforme abaixo. Só que na URL do artigo não tem o hifem separando as palavras, já nos anúncios as palavras ficam separadas por hifen.
#RewriteEngine On
#RewriteCond %{SCRIPT_FILENAME} !-f
#RewriteCond %{SCRIPT_FILENAME} !-d
#RewriteRule ^post\/(.+)$ post.php?cod=$1
#RewriteRule ^anuncio\/(.+)$ anuncio.php?cod=$1
RewriteEngine On
RewriteRule ^(.*)\/(.*)\/post\/?([0-9]*)\/?$ /post.php?cod=$3
RewriteRule post\/(.*)\/([0-9]*).html\/?$ /post.php?cod=$2
RewriteRule ^(.*)\/(.*)\/anuncio\/?([0-9]*)\/?$ /anuncio.php?cod=$3
RewriteRule anuncio\/(.*)\/([0-9]*).html\/?$ /anuncio.php?cod=$2
Isso tá causando erro de rastreamento do googlebot, porque as palavras da URL estão separadas apenas com um ESPAÇO. teste%20de%20Host/2.html
ALGUEM PODE ME AJUDAR?
Hugo, manda tudo para um so variavel e trata com php, explode!
Edivaldo, coloca os hifens dinamicamente e usa um redirecionamento permanente (301) nas url antigas.
[…] Como fazer URLs amigaveis com .htaccess e php […]
Olá Diogo to criando um site e ainda sou novato e pouco sei URLS AMIGÁVEIS.
Mas achei muito legal, e queria uma ajuda pra eu entender, criar e deixar meu site como o seu.
O que estou criando está assim:
http://www.larfamiliafeliz.com.br/artigo.php/id=13&titulo=estudando a palavra de deus
E queria que ficasse assim.
http://www.larfamiliafeliz.com.br/artigo/estudando-a-palavra-de-deus
No meu site tem
index.php
artigos.php
noticias.php
testemunhos.php
estudos.php
fotos.php
videos.php
contato.php
Igor, procuro ajudar a todos, porem realizar a tarefa seria uma consultoria, e demandaria de investimento, ok?
Diogo,
li seu artigo e todos seus comentários mas ainda não consegui resolver minha url amigavel.
Vou mandar p vc meu código.
Estou usando o wampserv e já habilitei o modulo mod_rewrite.
Coloquei o aquivo .htaccess no diretorio tfd.
RewriteEngine On
RewriteBase /tfd/adm
RewriteRule ^formLisPacienteLis\/([0-9]+)\/?$ /?telas=formLisPacienteLis&id=$1 [NC]
No sistema tenho um diretório chamado tfd. Dentro do diretório tfd tenho; um aquivo index.php, um diretório secoes, um diretório classe e um arquivo.php dentro do diretorio diretório classe.
Esse é o meu código no index:
trocarURL($_GET[“telas”]);
?>
——————————————————————————————–
Esse é meu código no arquivo.php que fica no diretório classe:
class verURL{
function trocarURL($url){
if(!empty($url) && (!file_exists(“telas/$url.php”))){
$url = “home.php”;
}else{
$url = “telas/$url.php”;
}
include_once(“$url”);
}
}
Olá Diogo primeiramente parabéns pelo post, e segui seu tuto só que no meu servidor local esta dando erro Request url sei que ela não esta encontrando a url ,mas por exemplo que deixar minha url assim http://localhost/web/home/, como proceder no .htaccess eu por exemplofiz desta forma mas não funfou:
o meu htaccess ficou assim
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^home/$ /funcao.php?[L]
e na função:
poderia me dar um help nisso.
Ah esqueci de dizer eu uso o Wamp server 2.2 com php 5.4 e apache 2.2.22
Peter, tenta em um servidor WEB. Pode ser configuracao local da sua maquina. So pra garantir.