Como fazer URLs amigaveis com .htaccess e php

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

  1. É 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!

  2. 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!

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

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

  5. 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…

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

  7. Ah tem mais uma coisa:

    No exemplo deste tutorial, só incluía html, nada de PHP oO

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

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

  10. 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 :)

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

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

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

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

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

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

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

  18. Legal o tutorial, nem lí direito copiei tudo e fechei os olhos, funcionou que é uma beleza.

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

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

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

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

  23. 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á.

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

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

Deixe um comentário

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.