Manipulando URLs com .htaccess no Apache
Postado por: Flávio Rodrigues em
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.















boa, to trocando pra o apache vou logo modificar isso…
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
Estas “,” repetidas nas listas das expressões regulares não fazem sentido, basta uma só, não precisa de uma a cada intervalo.
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.
Muito melhor é usar o framework Code Igniter que faz isso automaticamente
http://www.codeigniter.com
@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?
Nunca consegui entender isso.
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/
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
Muito boa essa dica não conhecia esse método.
valeu
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.
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?