Manipulando URLs com .htaccess no Apache

Postado por: Flávio Rodrigues em
.htaccess

Hoje vou postar uma dica bem interessante e que provavelmente será útil a todos os desenvolvedores. Quem nunca se deparou com a seguinte URL:


http://www.seudominio.com.br/index.php?sessao=artigos&dia=25&mes=08&ano=2009

Pois bem, meio estranho não? Então que tal mudar para uma forma mais amigável:


http://www.seudominio.com.br/artigos/25/08/2009

Para isso basta utilizar o mod_rewrite. O mod_rewrite é um módulo do apache que realiza a reescrita transparente de URL’s usando expressões regulares. É como um redirecionamento, só que o usuário não fica sabendo que a página foi reescrita.

O primeiro passo é criar um arquivo .htaccess no diretório raiz do seu site (DocumentRoot e acrescentar a linha:

RewriteEngine On

Esta linha habilita o uso do mod_rewrite no seu site. Depois a segunda linha de seu .htaccess será:

1° Exemplo:

RewriteRule ^([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/?$ exemplo1.php?dia=$1&mes=$2&ano=$3

Vamos entender a linha acima:

  • RewriteRule: define o início de uma regra de reescrita.
  • ([a-z,0-9,A-Z,_-]+): Todos os caracteres (Números e Letras) + _ -
  • \/: barras.
  • \/?: uma barra ou vazio.

2º Exemplo:

URL: http://www.seudominio.com.br/artigos/10/12/2006/30

RewriteRule ^artigos\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/?$ exemplo2.php?sessao=artigos&dia=$1&mes=$2&ano=$3&id=$4

Qual a diferenca entre o 1º exemplo para o 2º exemplo? A diferenca é que ele manipula uma URL /artigos/ somente se for www.seudominio.com.br/artigos/10…, caso seja www.seudominio.com.br/10/10/2006, ele não ira executar a segunda regra. Tendo isso em mãos, você pode adaptar a sua aplicação, porém não esqueçam de fazer as exceções.

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Gostou desse post?

Assine o nosso Feed RSS, siga-nos no Twitter, ou simplesmente nos recomende a seus amigos!

Sobre Flávio Rodrigues

Flávio Rodrigues é programador pleno, tecnólogo em Sistemas de Informação pelo Curso e Colégio Nova Era em Joinville - SC

Central Server

12 Responses to “Manipulando URLs com .htaccess no Apache”

  1. boa, to trocando pra o apache vou logo modificar isso…

  2. Nil disse:

    Cara desculpe mas ainda não entendi e tenho dificuldade de entender como ele substitui
    index.php?sessao=artigos&dia=25&mes=08&ano=2009

    somente colocando essa expressão aqui

    ^([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/?$

    sempre foi um problema para mim isso

  3. Igor disse:

    Estas “,” repetidas nas listas das expressões regulares não fazem sentido, basta uma só, não precisa de uma a cada intervalo.

    • leir disse:

      Sempre metido a sabichão Igor, porque não para de criticar os outros e tenta ajudar um pouco!
      O posto está ótimo e os comentários são de pessoas assim como eu, normais sem sua superioridade preconceituosa.

  4. Thallis disse:

    Muito melhor é usar o framework Code Igniter que faz isso automaticamente

    http://www.codeigniter.com

  5. Célio disse:

    @NIL

    O segredo está em dois lugares:

    1 – Nos grupos da regex
    2 – Nos $N

    Quebre a expressão em três partes, uma para cada grupo. Fica assim:

    ([a-z,0-9,A-Z,_-]+)
    ([a-z,0-9,A-Z,_-]+)
    ([a-z,0-9,A-Z,_-]+)

    Agora veja a segunda parte do RewriteRule:

    exemplo2.php?sessao=artigos&dia=$1&mes=$2&ano=$3&id=$4

    O RewriteRule “substitui” os grupos pelos $N de acordo com a posição, sacou?

  6. Wilson disse:

    Nunca consegui entender isso.

  7. Para quem sabe um pouco de inglês e quer algumas dicas de expressões regulares bem fáceis, dêem uma olhada nesta página: http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

  8. Pablo disse:

    i have a problem with the css and images!
    my htaccesss:
    RewriteEngine on
    #RewriteRule \.(css)$ /css/
    #RewriteRule ^([A-Za-z0-9-]+)\/?$ index.php?idioma=$1 [L]
    #RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+).php?$ $2.php?idioma=$1 [L]
    #RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ nueva.php?idioma=$1&par2=$2 [L]
    RewriteRule ^([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/([a-z,0-9,A-Z,_-]+)\/?$ index.php?idioma=$1&mes=$2&ano=$3&id=$4

  9. marcelo alves disse:

    Muito boa essa dica não conhecia esse método.

    valeu

  10. João Carlos disse:

    Um exemplo simples para ajudar quem tiver dificuldades em entender…

    RewriteEngine on
    RewriteRule produtos/(.*)/(.*) index.php?produto=$1&categoria=$2

    Nesse exemplo, se a pessoa que está acessando o site digitar:
    http://site/produtos/perfumaria/boticario

    é o mesmo que digitar:
    http://site/index.php?produto=perfumaria&categoria=boticario

    Os parênteses são sessões, e entre eles (.*), os caracteres que são considerados, nesse caso, qualquer um.

    $1, $2, … são parâmetros equivalente a cada sessão (.*).

    / é o que divide cada sessão.

    Depois, no PHP, é só usar $_SERVER['QUERY_STRING'] para recuperar a query.

    Bom, espero ter ajudado… Flávio, por favor, me corrija se eu estiver errado.

  11. Paiva Junior disse:

    Fazendo isso, as URLs da forma antiga, ou seja, com “site.com&cat=categoria&prod=produto” continuam funcionando paralelamente ao novo formato “site.com/categoria/produto”?
    Resumindo funciona um modo E o outro. Ou funciona um modo OU o outro?

Leave a Reply