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.
1 2 3 4 5 | 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.
1 2 3 4 5 | $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.

outubro 14th, 2009 at 14:31
É importante lembrar que o arquivo .htaccess precisa ter a permissão “444″ para que o site não dê erro 500.
Muitos clientes de ftp re-atribuem a permissão para 644. Eu consegui mudando no gerenciador de arquivos, via painel de controle.
Só complementando porque fiquei um certo tempo batendo a cabeça. Mas ótimo artigo! Vou usar algumas vezes, com certeza!
novembro 20th, 2009 at 16:20
O problema chefe, é que todo mundo acha que todo mundo sabe fazer url amigáveis, seja mais específico, a minha pagína tem dezenas de links, como e o processo para mais de uma, e no link, o que escrevo em link, e no RewriteRule, lá é criado uma dessa para cada link, pow, tem que aprender a fazer um tutorial, no dia que eu souber como funciona exatamente, você verá como se escreve, estou a horas na internet e não tem ninguém que saiba explicar direto! Valeu assim mesmo!
fevereiro 11th, 2010 at 17:18
O problema, amigo aí de cima… é que você deve estudar mais lógica de programação.
Gostei do tutorial, muito funcional, porém não seria necessário criar um arquivo para tratar a url recebida, Tudo pode ser feito apenas no .htaccess explorando um pouco mais as expressões regulares.
vlw ^^
fevereiro 11th, 2010 at 17:30
Matheus, o tutorial se destina a usuarios leigos em programação, principalmente se tratando de htaccess. Eu estudo sempre para me atualizar, valeu pela dica, mas da proxima poderia ser mais construtiva. Da proxima vez irei colocar uma ajuda á sua altura. ;)
fevereiro 17th, 2010 at 16:09
Fiz o tutorial, mas não deu certo, meu site tem exatamente este exemplo: noticias.php?id=111
estou testando em localhost, e meu server apache esta habilitado… alguma dica…
março 17th, 2010 at 16:55
Boa tarde, migrei meu site para url amigavel com htaccess e deu td certo, porém o google ja tinha indexado as urls antigas e agora está aparecendo na central de Webmaster do google um monte de paginas com meta tag title e description duplicados. Ex.:
http://www.moteisehoteis.com.br/moteis/ e http://www.www.moteisehoteis.com.br/moteis.php. Alguém ja passou por isso e pode me ajudar?
março 22nd, 2010 at 23:42
AMigo, nao manjo muito
pode me ajudar, eu consigo deixar link do artista link amigavel
me add no msn djthoty@hotmail.com
vlw
março 23rd, 2010 at 08:22
A configuração:
# URLs amigaveis
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^([^-]+)/$ /index.php?param=$1&uid=$2&type=$3
A url: http://localhost/news/18/slideshow
Como faço pra incluir um arquivo com include, ou selecionar dados do banco a partir das ids do segundo parâmetro?
março 23rd, 2010 at 08:23
Ah tem mais uma coisa:
No exemplo deste tutorial, só incluía html, nada de PHP oO
abril 28th, 2010 at 15:14
Cara, seguinte…. eu to começando a estudar url amigavel….htacess e tudo mais.
preciso direcionar isso /analise.php?id=1 para por exemplo analise/1. Agradeço se puder dar uma força.
maio 9th, 2010 at 20:21
Não sei se aqui pode postar dúvida.
É o seguinte, eu uso URL amigáveis da seguinte forma:
RewriteRule ^([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)$ /forum/viewforum.php?f=$2
Isso é usado em um fórum phpBB3
Ele cria um link, tipo:
http://www.site.com/assunto/1/2
Só que acontece o seguinte: O link é criado sem problema, mas, pelo log de erro do meu cPanel, ele interpreta como se assunto fosse uma pasta, ou seja, um visitante entra em uma página e o servidor achar que esse link é uma pasta, como não encontra a pasta retorna erro. Alguém sabe como resolver?
maio 10th, 2010 at 18:04
Vlw galera, já resolvi o problema nesse fórum
http://www.codigosnaweb.com/forum/
maio 19th, 2010 at 13:42
Diego, é tranquilo, tente algo como:
RewriteRule ^analise\/?([0-9]+)\/?$ analise.php?id=$1
maio 19th, 2010 at 13:52
Tyler, presta atenção no artigo, LEIA. O que voce quer tem na funcao.php
maio 19th, 2010 at 13:59
James, testa em um servidor linux, apache com mod_rewrite ativo.
maio 20th, 2010 at 09:02
Sr. Matheus, se você acha que não esta bom então posta você mesmo o seu código! Não desmotiva aquela pessoa que só esta afim de ajudar. Obrigado Diogo :)
maio 28th, 2010 at 22:01
muito obrigado! a melhor explicação que encontrei!
junho 3rd, 2010 at 22:10
Olá, estou tendo dificuldades p/ fazer a url amigavél
.htacess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^([^-]+)/$ /index.php?param=$1&uid=$2&type=$3
como devo fazer a chamada no link Quem somos
desde já agradeço, fico aguardando uma ajuda
junho 8th, 2010 at 00:20
Galera, tenho uma url assim: http://localhost/learnenvironment/rewrite/qualquercoisa …
Sendo que quando chamo pelo navegador com o objetivo de chamar só a página qualquercoisa, não consigo … alguém pode ajudar?
novembro 5th, 2010 at 19:52
Olá Pessoal,
gostaria de saber se existe a possibilidade de fazer uma url amigavel, modificando a atual que uso.
Url em uso: imoveis.php?id=242+Teste+Teste
Nova se possivel: imoveis/teste/teste ou imoveis/teste-teste
Desde já abraços.
novembro 19th, 2010 at 22:45
Adilson, é possivel sim, basta seguir as dicas acima. Se não conseguir, entre em contato para uma consultoria.
novembro 30th, 2010 at 04:48
tenho a seguinte pagina mas não estou conseguindo fazer uma url amigavel para ela da erro.
ex:www.noticia.com.br/conteudo.php?id=39
para :www.noticia.com.br/conteudo/a-gerra-da-midia/39.html
a url é transformada mas não acha a matéria
codigo htaccess:RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ /$1.php?url=$2&id=$3 [L]
função php que remove caracteres:
função php que trnasforma a url:/.html
desde já agradeço
dezembro 23rd, 2010 at 21:52
Olá, estou tendo dificuldades p/ fazer a url amigavél .htacess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L] RewriteRule ^([^-]+)/$ /index.php?param=$1&uid=$2&type=$3 como devo fazer a chamada no link Quem somos desde já agradeço, fico aguardando uma ajuda
dezembro 24th, 2010 at 02:03
Parabéns!
Excelente explicação!!
Já está nos favoritos, valeu!
dezembro 25th, 2010 at 19:50
Olá, estou tendo dificuldades p/ fazer a url amigavél .htacess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L] RewriteRule ^([^-]+)/$ /index.php?param=$1&uid=$2&type=$3 como devo fazer a chamada no link Quem somos desde já agradeço, fico aguardando uma ajuda
janeiro 18th, 2011 at 18:01
Glenda, não entendi a sua pergunta, pode tentar me explicar melhor o que esta tentando fazer?
fevereiro 16th, 2011 at 10:20
Diogo, eu consegui fazer o rewrite, e as urls amigaveis, mas quando o link se direcionada para uma página .php dentro de um diretório, as imgs quebram, agora se a página fica no diretório raiz do site, fica tudo normal. O que pode ser?
março 16th, 2011 at 08:32
Minhas páginas são criadas através de includes, do tipo:
index.php?pagina=empresa.php
A página empresa fica dentro da pagina index, como fazer url amigavel pra ela?
março 16th, 2011 at 19:30
Legal o tutorial, nem lí direito copiei tudo e fechei os olhos, funcionou que é uma beleza.
abril 4th, 2011 at 22:40
Ricardo, é porque voce ta usando referencia da imagem sem usar a base. Coloque a url completa da imagem ou use a meta tag BASE… eu pessoalmente prefiro a segunda opção.
abril 4th, 2011 at 22:44
Renan, tem como fazer sim. Mas por motivos de segurança, não faça include desse tipo.
abril 4th, 2011 at 22:45
Chiquinho, beleza! Mas da uma lida depois, para aprender. :P
maio 3rd, 2011 at 09:20
muito bom seu post, valew pela iniciativa me ajudou muito.
julho 11th, 2011 at 16:36
Bom dia Diogo,
Fiz como você falou e funcionou direitinho, mas alguns outros links (que eram normais) assim como subdominios, começaram a dar pau. O que você acha que deu esse problema?
Outra coisa tentei fazer algo do tipo: http://www.exemplodominio.com.br/noticia/primeira-noticia
mas deu pau, sendo que quando eu testo: http://www.exemplodominio.com.br/noticia/primeira_noticia
ele funciona direitinho. Por que com o traço ele da erro?
Obrigado.
julho 21st, 2011 at 10:22
Tomaz, é so alterar a expressão regular da ultima linha, vou fazer um post com novas ideias e melhorando substancialmente o codigo acima. A ER da última liinha esta negando o hifen.
agosto 16th, 2011 at 17:59
desculpe meu grau de leiguise Xis, mas posso usar URLs amigáveis em sites feitos completamentes em HTML? apenas por questões de otimização.
setembro 6th, 2011 at 02:25
Cara nao consigo fazer funcionar, copiei os arquivos, mas como eu chamo? deve escrever no navegador http://www.exemplodominio.com.br/noticia.php?id=1237 e esperar que ele faça um reload e mostra ela amigavel??? como faço para testar se esta funcionando, reli nao ficou claro esta parte. Obrigado, se puder me responda por email.
setembro 12th, 2011 at 10:27
Muito bom mesmo, resolveu meu problema. Continue assim…
setembro 12th, 2011 at 11:14
Evandro, pode sim, mas pra cada pagina HTML voce vai ter que fazer uma linha, nao sei se é viavel, ok?
setembro 12th, 2011 at 11:17
Voce deve digitar mesmo no navegador a URL dinamica pra ver se ta funcionando! munheca mesmo!
setembro 12th, 2011 at 17:01
Diogo, preciso criar uma URL amigável do tipo: meusite.com/busca2.php?ID=NOME&b=&b1=&b2=&ok=Procurar onde suma tudo e fique apenas meusite.com/NOME, não estou conseguindo!!
Grato desde já.
setembro 20th, 2011 at 16:19
[...] tempos atras aqui mesmo no blog, postei um artigo ensinando a Como fazer URLs amigaveis com .htaccess e php. Entretanto, para ficar mais completo, você pode incrementar a função abaixo: [...]
setembro 20th, 2011 at 16:21
Este script é apenas para pegar as variaveis da URL, e nao ao contrário.
outubro 7th, 2011 at 17:53
Diogo,
Tudo bem?
Nessa questão de URL amigável gostaria de esclarecer uma dúvida.
Como criar uma URL amigável do tipo http://www.meusite.com.br/titulo-da-minha-noticia ?
Vários blogs e forum ensinam a seguinte maneira http://www.meusite.com.br/noticia/1234, ou seja, notícia e id notícia, dessa maneira fica bastante estranho, acredito que a melhor maneira seja http://www.meusite.com.br/titulo-da-minha-noticia alguma vez você já realizou isso? Teria algum script ou dica de como fazer?
Obrigado.
outubro 24th, 2011 at 12:29
Everton, é do mesmo jeito. Em vez de usar o ID (numeros) para indexar o conteudo, você vai usar a string da noticia, toda ou em partes, ok?
novembro 9th, 2011 at 12:21
olá, estou estudando o seu post e achei interessantíssimo, mas estou quebrando a cabeça para faer em uma url como esta:
http://localhost/gpseletronicos/index.php?p=produtos&categoria=2&ncategoria=Calculadoras HP
seria possível? Obrigado!
novembro 9th, 2011 at 16:06
Leonardo é sim. So tem que ter cuidado de parsar as strings para url antes de usa-las. ;)
novembro 10th, 2011 at 15:20
Diogo, fiz igualsinho está no post, crei um diretório urlamigavel no htdocs, dentro crier index.php, funcao.php e noticia.php e em index.php criei um link teste e criei um voltar em noticia voltar. Copiei o conteudo passado para o .htaccess e nada de funcionar. É isto mesmo que deve ser feito???
Obrigado pela atenção.
novembro 16th, 2011 at 13:44
dourado.net e marta, obrigado por compartilhar e pelo esclarecimento. abs
novembro 25th, 2011 at 18:43
Souza, é bom sempre verificar se o seu servidor tem suporte ao MOD_REWRITE do Apache, ok? pode ser isso.
janeiro 30th, 2012 at 00:24
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!!
fevereiro 27th, 2012 at 19:51
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…
março 19th, 2012 at 16:44
Mario, é so usar a TAG BASE, que resolve o problema da “relatividade” dos links
março 19th, 2012 at 17:41
Genarks, é justamente isso que explica no post! ;)
março 20th, 2012 at 17:49
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 ?
março 21st, 2012 at 00:15
o certo é voce fazer com um ID.. mas da pra fazer com o titulo tb..
março 21st, 2012 at 03:09
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 ?
março 23rd, 2012 at 14:02
o erro é na expressão regular, é so colocar o hifen nela! :)
março 26th, 2012 at 06:18
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 ???