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
É 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!
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!
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 ^^
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. ;)
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…
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?
AMigo, nao manjo muito
pode me ajudar, eu consigo deixar link do artista link amigavel
me add no msn djthoty@hotmail.com
vlw
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?
Ah tem mais uma coisa:
No exemplo deste tutorial, só incluía html, nada de PHP oO
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.
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?
Vlw galera, já resolvi o problema nesse fórum
http://www.codigosnaweb.com/forum/
Diego, é tranquilo, tente algo como:
RewriteRule ^analise\/?([0-9]+)\/?$ analise.php?id=$1
Tyler, presta atenção no artigo, LEIA. O que voce quer tem na funcao.php
James, testa em um servidor linux, apache com mod_rewrite ativo.
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 :)
muito obrigado! a melhor explicação que encontrei!
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
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?
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.
Adilson, é possivel sim, basta seguir as dicas acima. Se não conseguir, entre em contato para uma consultoria.
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
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
Parabéns!
Excelente explicação!!
Já está nos favoritos, valeu!
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
Glenda, não entendi a sua pergunta, pode tentar me explicar melhor o que esta tentando fazer?
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?
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?
Legal o tutorial, nem lí direito copiei tudo e fechei os olhos, funcionou que é uma beleza.
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.
Renan, tem como fazer sim. Mas por motivos de segurança, não faça include desse tipo.
Chiquinho, beleza! Mas da uma lida depois, para aprender. :P
muito bom seu post, valew pela iniciativa me ajudou muito.
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.
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.
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.
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.
Muito bom mesmo, resolveu meu problema. Continue assim…
Evandro, pode sim, mas pra cada pagina HTML voce vai ter que fazer uma linha, nao sei se é viavel, ok?
Voce deve digitar mesmo no navegador a URL dinamica pra ver se ta funcionando! munheca mesmo!
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á.
[…] 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: […]
Este script é apenas para pegar as variaveis da URL, e nao ao contrário.
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.
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?
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!
Leonardo é sim. So tem que ter cuidado de parsar as strings para url antes de usa-las. ;)
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.
dourado.net e marta, obrigado por compartilhar e pelo esclarecimento. abs
Souza, é bom sempre verificar se o seu servidor tem suporte ao MOD_REWRITE do Apache, ok? pode ser isso.