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

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

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

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

  5. Cara você não explicou que isso aí teria que usar caminho absoluto!!! Tem alguma forma de fazer sem caminho absoluto?

  6. Bobagem ninguém vai decorar o id da postagem deixa como está , poucas pessoas olham as urls

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

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

  9. nao consigo usar isso porque provavelmente esta desativado em meu servidor o mod_rewrite e a pasta dele esta oculta.

  10. Tenho um problema com minhas imagens e scripts..
    Quando utilizo a URL amigável todas as imagens e scripts deixam de funcionar! =/

  11. 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! :)

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

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

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

  15. Segui o tutorial e não deu certo.
    Não dá pra compreender muito bem, tá mal elaborado o tutorial.

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

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

  18. Hugo, manda tudo para um so variavel e trata com php, explode!

  19. Edivaldo, coloca os hifens dinamicamente e usa um redirecionamento permanente (301) nas url antigas.

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

  21. Igor, procuro ajudar a todos, porem realizar a tarefa seria uma consultoria, e demandaria de investimento, ok?

  22. 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”);
    }
    }

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

  24. Peter, tenta em um servidor WEB. Pode ser configuracao local da sua maquina. So pra garantir.

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.