Rewrite URL – Reescrita de URL amigável para os mecanismos de busca

Existem várias formas de ajustar as URLs de forma que fiquem amigáveis aos mecanismo de busca como o Google.
Este tutorial ajuda o desenvolvedor à reescrever suas URLs (rewrite url) usando o arquivo .htaccess.

Utilizarei PHP com uma regra simples no arquivo .htaccess (para saber mais sobre este tipo de arquivo, joga no google)

O legal desses métodos de rewrite url é poder “Esconder” a tecnologia para os menos avisados e seu maior benefício mesmo já sabemos, refere-se à otimização para motores de busca, colaborando muito para o SEO aplicado em seu site.

Esse modelo de Rewrite URL abaixo é muito simples, mas muito funcional e prático ao mesmo tempo.

Faça assim no .htaccess

RewriteEngine On
RewriteRule !\.(jpg|jpeg|gif|css|swf|txt|js|png)$ index.php
/* Esta regra acima não reescreve tais tipos de arquivo,
    ou seja, os tratara como de fato são */

Se tiver localmente testando, no conf do Apache defina AllowOverride como all
Se estiver em um servidor remoto, verifique se mod_rewrite está habilitado junto ao seu provedor de hospedagem ou verificando as infos do PHP instalado.

Bom até agora tudo normal… em outras palavras, no .htaccess está definido agora que todo o tráfego passa pelo arquivo index.php menos os arquivos do tipo dos listados na regra.

Vamos com um pouco de PHP agora.

Na index.php é feito os processos necessários, manipulação dos parâmetros etc.
Utilizei a função explode() do PHP para separar os parâmetros

Veja o exemplo abaixo:

Ruim -> www.target.com.br/?cat=php&tuto=cadastro
Bom -> www.target.com.br/php/cadastro/tutorial-cadastro-login

Obs.: Perceba que o terceiro parâmetro é um conjunto de palavras chaves para ajudar com os mecanismos de busca, estas palavras devem ser bem relacionadas ao conteúdo da página. Uma dica interessante é que esta url inteira pode ser armazenada em banco de dados tornando-se o link permanente da mesma, assim é certo que aquela página só será acessada se o endereço for exatamente o endereço da própria, evitando confusões dos mecanismos de busca classificando-a como conteúdo duplicado, pois é sabido que cada página deve ter seu endereço único.

Bom, explicar isso aqui poderá sair do foco, então vamos deixar para um outro tutorial ;)

Continuando…

$gets = explode("/", $_SERVER['REQUEST_URI']);
$gets = array_shift($gets);

$secao = (isset($gets[0])) ? $gets[0] : NULL;
$subsecao = (isset($gets[1])) ? $gets[1] : NULL;

// $secao = php
// $subsecao = cadastro

// brinco como eu quiser no terceiro parâmetro em diante...

switch($secao){

case "php" :

switch ($subsecao){

case "cadastro" :

//...
//...
//etc

Sendo assim posso manipular como eu quiser, mas até aí tudo bem, o interessante é que posso brincar com o último parâmetro, posso colocar qualquer coisa e depois manipular ou não (gravar em bd, etc).

Posso usar quantos parâmetros eu quiser, mas não recomendo usar muitos, pois poderia não ser classificado como ponto positivo aos mecanismos de busca e sim tratado como spam.

Obs.: usei o array_shift() para não precisarmos descartar o array[0], pois assim o que vier depois do www.teusite.com.br torna-se o array[0].

array_shift() – Recomendo a leitura desta função para maior entendimento do seu funcionamento.

Mais uma dica: Caso você queira que uma pasta não seja interpretado como um parâmetro…

Exemplo.: www.teusite.com.br/admin

… onde vc realmente quer que /admin seja interpretado como pasta, basta acrescentar dentro desta pasta um arquivo .htacces com uma única linha…

RewriteEngine Off

Nota: Uma dica que pode resolver problemas que possam vir a ter, veja bem, os arquivos listados na regra não serão tratados como parâmetros e as pastas que tiverem o .htaccess definido com RewriteEngine  off também não, mesmo assim talvez venham a ter problemas com o caminho dos arquivos de imagens, js, css, enfim… todos listados na regra do .htacces, tipo imagens não serem exibidas e resultarão como quebradas, caminho errado, então o que digo para resolver isso é simples HTML:

Logo após a tag <head> defina a base para teu site.

Exemplo:

<head>
<base href="http://www.sistemabasico.com.br" />
...
...
</head>

Espero ter ajudado, qualquer dúvida manda um comentário.

Tópicos relacionandos

Publicado por

Razor

Conhecedor das artes gráficas, amante de design web, amigo íntimo do desenvolvimento web, com a pretensão de aprender e ajudar à quem busca conhecimento, me faço presente. =)

21 comentários sobre “Rewrite URL – Reescrita de URL amigável para os mecanismos de busca”

    1. Olá @xmaninho. Se você utiliza WordPress, esse tutorial não lhe ajuda em nada a não ser no sentido de aprendizagem. Pois a aplicação do rewrite que ensino neste tutorial não faz sentido no WordPress que já tem por padrão essa opção de URLs amigáveis.
      Bons estudos!

      1. hun :D

        Mas entao nao tem como eu tirar o index.php do meu site ?

        no caso ( custanada.com/index.php/categoria/titulo-do-post

        so quero apagar o index.php
        quando tiro ele nos links permanentes o resultado é pagina nao encontrada :/

        tem um solução?

        1. Olha só, solução existe pra tudo, mas esse tutorial não é para seu caso.
          Se tentou utilizar, volte para o que estava antes por padrão do WordPress.

          Fica a dica:
          Acesse teusite.com/wp-admin/options-permalink.php e é ali que vc configura o formato da tua URL.
          Para saber mais… MUITO mais sobre esse assunto em relação as URLs amigáveis do WordPress, acesse esse link abaixo e estude os diversos casos e utilize os ensinamentos que lhe for mais próximo ao teu desejo:
          http://codex.wordpress.org/pt-br:Usando_Links_per

          Bons estudos ;)

    1. Se comporta da mesma forma @Leonardo e o action="" deve apontar para o equivalente ao arquivo.
      Por exemplo:
      Eu costumo utiliza a condicional switch() e com isso pre determinar o caminho dos arquivos.

      case 'contato' :
      include 'contato.php';
      break;

      etc…

      Desta forma se no action tiver 'contato' apenas, ele enviará os dados do form para o arquivo contato.php
      Claro que para isso funcionar, deve acompanhar o tuto e dar atenção em como ensinei a recuperar os parâmetros enviados na url.
      Bons estudos!

  1. Ola amigo, achei bem interessante isto. Criei a 2 anos o site do curso da faculdade e hospedei no webnode.

    Comprei o dominio http://www.aquiculturaufpr.com, e este ano, montei o meu site de vendas na Homehost, e tenho espaço ilimitado, assim criei uma pasta e instalei o site la dentro. O que preciso fazer é o seguinte, reescrever a URL http://www.utidainformatica.com/drupal/ (onde esta o novo site) para http://www.aquiculturaufpr.com

    Deve ser muito facil, mas estou meio perdido, queria poder usar a hospedagem que ja possuo, e que apareça somente a url http://www.aquiculturaufpr.com

    Ja redirecionei o DNS do dominio http://www.aquiculturaufpr.com para o destino correto e criei redirecionamento na hospedagem, se digitar http://www.aquiculturaufpr.com cai no lugar certo http://www.utidainformatica.com/drupal/

    So falta saber como reescrever mesmo, desculpa ai o tamanho da explicação e se ficou confuso, se puder ajudar agradeço.

    Abraço

    1. Olá @Dirceu, um amigo meu a tempos atrás me mostrou algo que ele fez e sua pergunta me fez lembrar disso e perguntei pra ele novamente para dar uma relembrada e poder tentar te ajudar.
      Veja bem: crie um arquivo .htacces e coloque dentro do www ou public_html do domínio http://www.utidainformatica.com (não na pasta drupal, mas na raiz do www ou public_html mesmo)
      O conteúdo desse htacces seria mais ou menos isso:

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^(www.)?(aquiculturaufpr).com$
      RewriteCond /home/teu_user/www/%2 -d
      RewriteCond %{REQUEST_FILENAME} !^/home/teu_user/www/drupal
      RewriteRule ^(.*)$ /%2/$1 [L]

      Observação: altere ‘teu_user’ no cod acima pelo teu verdadeiro nome de usuário do domínio utidainformatica.com

      Enfim… acessando http://www.aquiculturaufpr.com irá ser exibido o conteúdo que está em http://www.utidainformatica.com/drupal

      Mas ainda falta algumas definições para que tudo isso funcione perfeitamente:
      Onde vc registrou o domínio aquiculturaufpr.com vc deve definir a autoridade DNS os NSs 1 e 2 apontando para os mesmos NSs 1 e 2 do domínio utidainformatica.com
      No painel de hospedagem do domínio utidainformatica.com, deve ter um lugar para você definir/adicionar os domínios que podem apontar para o teu site (utidainformatica.com), se não tiver como vc fazer essa adição de domínios permitidos para apontar ao teu domínio utidainformatica.com, aí não tem como… talvez só se vc pedir ao provedor de hospedagem ou trocar de hospedagem hehehe (se tiver usando o CPANEL fica simples de definir isso)

      Era isso… espero ter ajudado. Pedi para o meu amigo dar uma revisada por aqui pra ver se pode incluir mais alguma coisa ou não.
      Qualquer coisa fala aí.
      Abraço e bons estudos.

  2. Olá, muito bom o seu tutorial, poderia me tirar uma dúvida?
    No teu caso ali, como fica as urls no index.php ou no menu?
    Tipo no teu caso estaria algo ?cat=php&tuto=cadastro
    Mas com esta regra aí do php, como eu faria os ?

    Obrigado

    1. Olá William, o link ficaria assim:

      href="/php/cadastro" rel="nofollow"

      Observação: Não fiz a ancoragem do link como se deve, pois o sistema de comentários do WP muda tudo.

      O ideal ainda seria usar o caminho completo:

      href="teusite.com/php/cadastro" rel="nofollow"

      Os parâmetros você pega da forma que eu mostrei no exemplo em relação à variável $gets, usada para tratar o $_GET[]
      Bons estudos!

  3. Nao consigo fazer url amigaveis,
    para contato com o servidor utilizo a busca do database como ficaria este exemplo acima e na index o que eu preciso mudar em relação ao php explode() citado acima?

      1. Boa noite!

        Claro me desculpe.
        fiz a seguinte regra no .htaccess:
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^home\.html$ index.php
        RewriteRule ^novidades\.html$ noticias.php

        a pergunta é como usar a regra para no site ele buscar href=pagina?id=? e aparecer pagina/numero.html
        ?
        coloquei alguma coisa como :
        RewriteRule ^assunto-([0-9]+) \.html$ materia.php?id=$1
        o problema é que aperece na url assunto?id=numero

        vc pode me ajudar?

        1. Olá @Fabio, seria algo assim que tu quer?

          RewriteRule ^pagina\/([0-9]+)\.html$ /index.php?id=$1 [L]

          Lembrando que quando montar a sua URL no teu HTML vc deve usar o padrão reescrito:

          Exemplo: … href=”pagina/1.html”…

          A regra não vai pegar teus links num formato e transforma-los em outro, apenas vai conseguir interpretar a nova reescrita do link.

          Para que por exemplo o clique no link que tem uma estrutura como index.php?id=1 seja redirecionado para a mesma página com a nova url precisará de regras de redirecionamento.
          Procure sobre redirecionamento 301 permanente ou 302 temporário…

          Espero ter ajudado um pouco.
          Bons estudos!

  4. Bom dia.
    Cara ja quebrei de mais a cabeça com essa url amigavel.
    Meu site é o ofertabrasilia.com.br e os links para abrir as ofertas é: index.php?oferta=1.
    Fica horrivel, já tentei fazer e não consigo.
    Queria um metodo que não fosse preciso gravar no banco de dados.
    Más ele puxa o titulo da oferta e no link eu coloco algo do tipo: a href=”?= $catgoria_oferta;?/?= $id_oferta;?/?= $titulo_oferta;?”?= $titulo_oferta;?/a
    Entende? Más consegui algo aqui, só que acho q não sei configurar o htaccess… pois o css não apareceu, e outros includes….. dai a pagina ficou
    sem formatação.
    =\
    Pode me ajudar?

    1. Olá @Raul, a questão do css não rolar, é porque dves definir uma basename… eu informo isso no tutorial.
      Quanto a estrutura do teu link, vc pode ainda trabalhar da seguinte forma:

      /categoria/titulo-oferta-id

      ou ainda não buscar pelo id e sim pelo titulo oferta ficando assim:

      /categoria/titulo-oferta

      Onde categoria é $get[0] e titulo-oferta é $get[1]

      O .htacces deve ser feito como eu indico no tutorial, mas existem outras formas de definir para valer a mesma estrutura.

      Quanto ao php procure usar as tags tradionais < ?php echo ao invés de < ?=

      Bosn estudos!

  5. consigo buscar no banco de dados o id da opção de seleção, exemplo formulario de cidade,apresenta as cidades no formulario mais o problema que na pagina de busca aparece o id e nao o nome da cidade, vc pode me ajudar?

Deixe uma resposta

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