Publicidade   
 você está aqui: phpbrasil.com    artigos    artigo  
 
:: novos artigos ::

:: recomendado ::

PHP para a World Wide Web

Compre esse livro no Submarino.com.br

:: publicidade ::


:: novos scripts ::

:: elenco phpbrasil ::

Diógenes Sobral
Pontos: 2167

Visite a página de perfil de BOZOManipulando URL com .htaccess
por BOZO Esse usuário pertence aos 10 usuários mais ativos do site
Lista de Categorias  |  Contribua um Novo Artigo  |  Entre em Contato Conosco

Esse artigo tenta mostrar uma maneira mais simples de criar um sistema de sub-diretórios muito usado em blogs e fotologs, evitando a criação de diretórios, usando apenas um .htaccess como redirecionador.


Vote aqui!
Média de Votos Atual: 6.88
Total de Votos: 16
Nota:   

Criei um sistema de fotolog que gera um sub-diretório para cada usuário, (www.gambiarra.com.br/usuario) comecei criando um sistema que criava uma pasta para cada usuário e dentro dela uma index, que enviava para a página principal com o nome da pasta digitada, agora meu fotolog tem 10.001 usuários, meu servidor fez um backup e perdeu as permissões dos diretórios e estou tendo problemas em excluí-los quando fecho uma conta, já não bastava os problemas na hora de criar, além do que 10.001 pastas, 10.001 indices, e se precisar manipular todas essas pastas e seus arquivos por algum motivo?

Não gosto da idéia!


Existe alguma forma mais simples de se fazer isso?
Sim!

Como?
Com .htaccess!

o que é .htaccess?

O .htaccess é basicamente um arquivo, sem um nome, apenas com a extensão .htaccess, que manipula as propriedades do diretório atual e de seus sub-diretórios no Apache.

Vamos usar a propriedade Rewrite para reescrever a url deste diretório.

Primeiro ligamos o modo de reescrita de url, Rewrite.

RewriteEngine on

Logo depois setaremos as regras de reescrita da url com RewriteRule.

RewriteRule URL_VIRTUAL URL_FISICA

URL_VIRTUAL = Url digitada no navegador, que será reescrita de acordo com uma Expressão Regular

URL_FISICA = Url do redirecionamento

ex:


RewriteRule ^([a-z,0-9,A-Z,_-]+)$ /index.php?ID=$1


Neste caso a expressão seta os caracteres que serão aceitos na URL, no caso, caracteres de


"a" até "z", "0" até "9", 
"A" até "Z", além de "_" e "-", 


e agrupa os caracteres digitados na url que serão repassados à url fisíca através de "$1".

Neste caso, quando digitada a url virtual, www.gambairra.com.br/BOZO, por exemplo, vai reescreve-la como www.gambiarra.com.br/index.php?ID=BOZO

Com isso, teremos na página index.php a variável ID=BOZO, para manipular como quiser, com isso bastaria fazer uma consulta no DB pelo nome, e de acordo com isso montar a página do usuário, sem aquele monte de diretórios e arquivos.

Resumindo, para criar um sistema de sub-diretórios para fotolog, blog e afins, basta criar um .htaccess com o conteudo:


RewriteEngine on
RewriteRule ^([a-z,0-9,A-Z,_-]+)$ /index.php?ID=$1


e maniplular este ID, de acordo com suas necessidades.

Este foi meu primeiro artigo, e apesar de mal escrito, acredito que será bem útil.

Se conhece algum "CONTRA", por favor opine sobre.

Referencias:
http://httpd.apache.org/docs/1.3/howto/htaccess.html
http://apache.org/
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
http://pt.wikipedia.org/wiki/Express%C3%A3o_regular


<< Anterior 1 Próxima >>

 
Imprimir  |  Enviar para um Amigo


Comentários de Usuários

Bom !
publicado por pancado - 2006-07-20 12:23:58

Amigo,

Funcionou perfeitamente com uma variável.

Agora, como faz para 2 variáveis!?

Fiz esse teste, mas não funcionou: RewriteRule ^([a-z,0-9,A-Z,_-]+)$ /index.php?ID=$1&NOME=$2

Olha da uma lida no que eu axei
publicado por Gabriel Galiaso - 2006-07-20 13:43:08

Gerenciamento de URL’s - Criando URL’s amigáveis
Hoje em dia é muito comum o uso de scripts que rodam no servidor (server-side) para gerar conteúdo dinâmico em páginas web.

Isto é muito interessante, mas gera um problema: URLs grandes ou complicadas demais, difíceis de memorizar e sem significado, que podem até mesmo dificultar a indexação do site por mecanismos de busca.

Vamos aprender como criar URLs amigáveis, indexáveis e que resumam, de alguma forma, o recurso que elas descrevem.
Introdução
É comum vermos URLs do tipo:
index.php?section=artigos&data=09-08-2004
ou
index.php?s=web&p=1
ou piores que isso, como:
/cgi-bin/index.cgi?id=7288731803928617293&page=6

Os exemplos acima são fictícios mas, com certeza você já se deparou com URLs bem parecidas com essas, inclusive em sites muito conhecidos.

Qual o problema dessas URL’s?
A princípio você pode pensar que não há problema algum com essas URLs. Mas pense um segundo. Você consegue decorar uma URL desse tipo? Não seria muito melhor que fosse algo do tipo:
www.site.com/artigos/09/08/2004
ou
www.site.com/web/1

Além do problema da complexidade, essas URLs geram outros problemas:

Alguns mecanismos de busca podem deixar de indexar estas páginas, por causa dos caracteres ‘?’ e ‘&’

A tecnologia usada na construção do site está sendo exposta

Se você resolver mudar a tecnologia do seu site (php para asp, por exemplo), todas as URLs terão que ser mudadas

Expor a tecnologia usada para fazer um site pode ser um problema de segurança e, hoje em dia, qualquer cuidado com segurança, mesmo que pequeno, é importante.

E, além disso, com a mudança da tecnologia usada, todos os links e bookmarks que existam para o seu site serão quebrados, e isso não é nem um pouco interessante.

O que fazer então?
A solução que vou apresentar serve para os usuários do servidor web apache.

É necessário que esteja habilitado no servidor o módulo mod_rewrite e que seja possível o uso de arquivos htaccess.

A solução é simples: mapear as URLs reais para URLs “virtuais”, mais fáceis de compreender e indexar, e independentes da tecnologia utilizada.

É necessário um pouco de conhecimento de expressões regulares.

O que é o mod_rewrite?
mod_rewrite é um módulo do apache que realiza a reescrita transparente de URLs usando expressões regulares.

É como se fosse um redirecionamento, só que o usuário não fica sabendo que a página foi reescrita, já que o endereço na barra de endereços do browser não muda e nenhum cabeçalho HTTP 3xx é enviado.

Mãos a obra
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.

Agora vamos ? reescrita da URL. Vamos utilizar os exemplos acima. São exemplos simples, mas meu intuito é mostrar o funcionamento da técnica. Você pode usar a sua criatividade para fazer o que quiser e o que for necessário para o seu caso.

Primeiro exemplo: index.php?s=web&p=1

Analisando esta URL podemos perceber que temos duas variáveis (’s’ e ‘p’), provavelmente referentes a seção e página, respectivamente.

Vamos transformá-la em: /web/1

A regra ficaria assim:

RewriteRule ^(.+)\/?([0-9]*)\/?$ /index.php?s=$1&p=$2

Vamos entender a linha acima:
RewriteRule: define o início de uma regra de reescrita.

^(.+)\/?([0-9]*)\/?$: a url “virtual”, ou seja, a url que será usada nos links para esta página. Para que entende um pouco de expressões regulares, esta expressão é bem simples de entender, vamos dissecá-la:
(.+): significa um ou mais caracteres (.). O significado dos parêntesis vai ser explicado mais adiante.
\/?: zero ou uma barra (/). A contrabarra (\) serve para “escapar” o caractere /, informando que ele deve ser interpretado literalmente, e não como um metacaractere.

([0-9])*: qualquer quantidade de dígitos (números), ou seja, zero ou mais.
/index.php?s=$1&p=$2: esta é a URL real, ou seja, a url que vai estar sendo acessada por meio do mod_rewrite.
As expressões ‘$1' e ‘$2' significam o primeiro e segundo conjunto de caracteres agrupados por parênteses na expressão da esquerda. Ou seja, é guardada uma referência para esses grupos de caracteres para que você possa usá-los.

Exemplos do resultado desta regra:

/web/1 ou /web/1/ = /index.php?s=web&p=1
/outrasecao/5 ou /outrasecao/5/ = /index.php?s=outrasecao&p=5
/web ou /web/ = index.php?s=web&p=

Vamos a mais um exemplo:

RewriteRule ^artigos\/?([0-9]+)\/([0-9]+)\/([0-9]+)\/?$ index.php?section=artigos&data=$1-$2-$3

(Perceba que a linha pode estar quebrada para caber no espaço, mas trata-se de uma linha só, sem quebras).

Assim, você poderia acessar a URL index.php?section=artigos&data=09-08-2004 pela URL “virtual” artigos/09/08/2004, bem mais amigável do que a primeira.

Não apenas páginas dinâmicas podem ser reescritas por meio do mod_rewrite. Conteúdo estático também.

Um exemplo:
www.site.com/noticias/09-08-2004.html
poderia ser reescrita para
www.site.com/noticias/09/08/2004

usando a regra

RewriteRule ^noticias\/?([0-9]+)\/([0-9]+)\/([0-9]+)\/?$ /noticias/$1-$2-$3

Conclusão
O intuito deste artigo foi apresentar o mod_rewrite e mostrar como criar URLs mais amigáveis, tanto para o usuário quanto para os mecanismos de busca. Você pode fazer praticamente qualquer mapeamento de URLs utilizando o mod_rewrite, o que você precisa é identificar um padrão nas URLs do seu site e criar as regras de reescrita. O limite é o da sua criatividade.

Alguns links para artigos semelhantes e recursos interessantes que podem ajudar bastante:

Artigo de Bill Humphries para o site A list apart que serviu de base para este

Documentação do mod_rewrite

Guia de expressões regulares

Cool URIs don’t change por Tim Berners-Lee

URL as UI por Jakob Nielsen

Re: Olha da uma lida no que eu axei
publicado por pancado - 2006-07-20 15:12:53


Eu tentei assim:
RewriteRule ^([a-z,0-9,A-Z,_-]+)$ ?pagina=$1&letra=$2

Mas dá erro!

Só consigo assim:
RewriteRule ^([a-z,0-9,A-Z,_-]+)$ ?pagina=$1

Eu queria que o resultado fosse assim:
http://www.site.com.br/2/a

Não estou conseguindo
publicado por Eduardo Costa - 2006-07-20 23:00:47

Não estou conseguindo....
Tem como me passar o .htaccess já feito?

Obrigado

Re: Não estou conseguindo
publicado por Eduardo Costa - 2006-07-20 23:01:51

Editado
-----------------------------------

Tipo, minha url tá assim:

http://localhost/pessoal/flog/foto.php?id=3

como eu faria para por em execução o .htaccess ?

Pancado...
publicado por BOZO Esse usuário pertence aos 10 usuários mais ativos do site - 2006-07-21 06:35:42

No caso uma variavel seria suficiente, não vejo necessidade de passar duas, vc poderia usar assim

gambiarra.com.br/forum/123

com isso vc terá a var "forum/123" e poderia usar um explode e vai ter 2 variaveis, "forum" e "123"

dudu...
publicado por BOZO Esse usuário pertence aos 10 usuários mais ativos do site - 2006-07-21 06:40:55

Basta criar um arquivo chamado .htaccess na raiz do seu site com o conteudo


RewriteEngine on
RewriteRule ^([a-z,0-9,A-Z,_-]+)$ /pessoal/flog/foto.php?id=$1

BOZO !!!!!
publicado por pancado - 2006-07-21 08:27:40

Mas o que acontece é que meu sistema possui duas variáveis juntas.

Ex: http://www.site.com.br/?pagina2&letra=a

Pois lista por letra e cada letra a paginação também é feita, compreende?

BOZO, denovo !!!!
publicado por pancado - 2006-07-21 08:33:51

Outra coisa também. Uma variável em meu site, é listada pelo nome da pessoa. Quando coloco:

RewriteEngine on
RewriteRule ^([a-z,0-9,A-Z,_-]+)$ /?nome=$1

.. se o nome conter acento ou algum caracter especial, ocorre erro.

Como posso fazer?

Agradeço desde já.

Re: BOZO !!!!!
publicado por Ronaldo Campos de Oliveira - 2006-07-21 12:31:16

Mas quando voce quer passar mais de uma variavel voce tem que adicionarmais um ( ) na regra, como está escrito no comentario gigante q o cara deixou... o q tiver no primeiro () vai ser o $1 o que tiver no segundo () é o $2.

Pancado...
publicado por BOZO Esse usuário pertence aos 10 usuários mais ativos do site - 2006-07-21 14:10:08

Cara no caso da pra fazer o que te disse, dá até pra fazer uma experssão que pegue as duas, mas se precisar de 3 vai ter que mudar e tal, desta fotma fica facil de recuperar quantas variaveis forem necessarias


http://www.site.com.br/?pagina2&letra=a

fica

http://www.site.com.br/2/a

vc terá 2/a , usando o explode vc ter´pa as 2 variaveis

no caso do acento, não se usa colocar url com acento, acho que até daria pra fazer mas não acho legal...

P/ BOZO
publicado por pancado - 2006-07-21 17:46:37

Amigo, consegui!!

Para duas variáveis, coloquei assim:
RewriteRule ^pagina/([0-9]*)\/?letra/(.+)*\/?$ ?pagina=$1&letra=$2

Resultado: http://www.site.com.br/pagina/2/letra/a
---------------------------------
E ainda aprendi a tirar a extenção .php assim:
RewriteRule ^login(.*)?$ login.php

Resultado: http://www.site.com.br/login
---------------------------------
Muito obrigado!!

Abraço ;)

2 variaveis
publicado por RafaelOlanda - 2006-07-23 07:50:06

consegui usar com duas variveis assim:

RewriteRule ^([a-z,0-9,A-Z,_-]+)/(.+)$ /?area=$1&pagina=$2

ele muda de:

http://www.site.com.br/?area=interacao&pagina=contato

para:

http://www.site.com.br/interacao/contato

porém estou com um problema ainda maior hehe, as imagens , folhas de estilos CSS e javascripts não abrem :D .. estes ficam como se fossem uma página.. por ex, se eu tentar abrir o logo do site pelo url http://www.site.com.br/imagens/logo.jpg aparece a mensagem de erro que eu configurei no querystring


peço aos amigos que me ajudem, pois o site está sem nenhuma imagem e formatação

P/ RafaelOlanda
publicado por pancado - 2006-07-23 13:54:15

Tenta por a url completa.

Ex: Se estiver /css/estilo.css
coloque
http://www.site.com.br/css/estilo.css

Abraço ;)

P/ RafaelOlanda
publicado por pancado - 2006-07-24 08:33:19

Ops.. eu vi que está faltando o sinal de ? para dividir as variáveis.

Tenta assim:
RewriteRule ^([a-z,0-9,A-Z,_-]+)?/(.+)?$ /?area=$1&pagina=$2

P/ RafaelOlanda
publicado por pancado - 2006-07-24 08:34:04

Estou usando assim em meu site, e funciona perfeitamente:

RewriteRule ^pagina/([0-9]*)\/?letra/(.+)*\/?$ ?pagina=$1&letra=$2

Abraço ;)

observação
publicado por Keylly Eyglys - 2006-07-25 05:41:19

Apenas para acrescentar:
"o que é .htaccess?

O .htaccess é basicamente um arquivo, sem um nome, apenas com a extensão .htaccess, que manipula as propriedades do diretório atual e de seus sub-diretórios no Apache."

Na realidade, em sistemas *nix (Unix, linux, e semelhantes) arquivos/diretórios (etc) que começa com ".", são ocultos. Portanto .htaccess é um arquivo oculto sem extensão (afinal, nos sistema *nix, a extensão é apenas um enfeite visual)

Gostei do artigo, parabéns a todos!

gracias!
publicado por André Miani - 2006-07-25 05:51:45

Legal! me ajudou pacas!

Humm..
publicado por Miguel Jorge de Oliveira Couto - 2006-07-25 10:30:56

Olá, uso isso a bastante tempo em meu site, é muito bom e dá para se fazer qualquer coisa.

Só que eu gostaria de saber o seguinte, supondo que um usuário seja identificado assim: http://www.site.com.br/perfil.php?user=nome

Tem como ele passar a ser identificado assim: http://nome.site.com.br/?

Tem muitos sites na internet que favorecem esse tipo de coisa mediante ao cadastro, gostaria de saber se tem algo relacionado ao mod_rewrite do apache, ou se é uma coisa mais complicada, ligada internamente com o servidor

retirar extensão .php
publicado por Hunter - 2006-07-27 07:56:00

digamos que eu queira não mostrar todas as extensões .php das minhas páginas, eu teria que fazer regras para cada página diferente?

outra coisa, no recebimento de variáveis pelo metodo get afeta alguma coisa? Tipo eu tenho uma página assim:

noticia.php?id=123

então ela virar isso: noticia.php/123

eu consigo receber esta variável 123 utilizando: $id =$_GET[id];

Cara, esse artigo é muito interessante, parabéns, sempre vi as urls do site http://www.tableless.com.br e quiz fazer igual.

Poh o negocio eh bao memo
publicado por brasilio thomazo - 2006-08-06 14:44:48

Poh ate um tempo atraz eu nem sabia oq era .htaccess mas sabia que era util mas depois desse artigo vou me aprofundar mais nesse assunto.

Voce conhece um site com um bom tutorial sobre isso.

pq porem-quanto soh sei redirecionar minhas paginas de erro (404, 500, etc) e proteger um diretorio.

valeu mano ta de parabens.

Poh o negocio eh bao memo
publicado por brasilio thomazo - 2006-08-06 14:44:54

Poh ate um tempo atraz eu nem sabia oq era .htaccess mas sabia que era util mas depois desse artigo vou me aprofundar mais nesse assunto.

Voce conhece um site com um bom tutorial sobre isso.

pq porem-quanto soh sei redirecionar minhas paginas de erro (404, 500, etc) e proteger um diretorio.

valeu mano ta de parabens.

Artigo
publicado por Rafael Dohms - 2006-08-09 07:01:30

Também escrevi um artigo sobre o mod_rewrite.
Cabe resaltar que ele não é padrão do Apache, deve ser adicionado na compilação.

http://www.rafaeldohms.com.br/2006/07/25/mod_rewrite_url_amigavel/pt/

Vários diretórios com urls limpas
publicado por BunnyMan - 2006-08-13 10:37:46

Isso funciona caso eu tenha vários diretórios com seus respectivos index?

Dúvida
publicado por Rotting Christ - 2006-09-01 11:55:05

Bom Artigo!!!
Mas queria saber se é possível usar esse método em um servidor local, Apache?

No servidor na web funcionou normalmente!!!

Internal Server Error
publicado por Fábio - 2006-10-01 14:37:49

QUAL O PORQUE DO ERRO ABAIXO?

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@dominio.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Apache/1.3.33 Server at localhost Port 80

.htaccess no windows? Como?
publicado por Adão Gearles Barros de Amorim - 2006-11-21 02:39:15

Oi! gostei muito deste artigo, bem interessante mais tive algumas dificuldades pelo fato de está usando o apache no windows. Alguém sabe se é possivel usar o .htaccess de alguma forma no windows, so pra reforçar não se consegue criar arquivo sem nome nos sistemas Windows! acho q deve ter outra forma ja vasculhei no Google mais não conseguir achar algo que explicasse claramente.

Desculpas pelo bolo de texto acima
publicado por Adão Gearles Barros de Amorim - 2006-11-21 02:42:48

Não sabia q poderia usar quebras de linhas

.
.
.
.
.
Ótimo!!

Projetos Customização
publicado por Marcelo Veras - 2006-11-24 10:51:51

Atenção Programadores PHP / MySQL

Tenho uma consultoria que atende empresas em toda a América Latina, tenho como principais clientes a Alcatel e a Ford. Uma das principais ferramentas de minha empresa é baseada em PHP/MySQL (http://www.workforcesys.com) e minha empresa precisa a cada venda de um profissional para customizá-la. Enviem seus CV's para:
marcelo.veras@workforcesys.com

Não importa o estado onde vc more (temos projetos no Brasil todo e para fora do Brasil inclusive)

É importante possuir alguma experiência em implementação de sistemas de gestão e habilidade para aplicar treinamentos aos usuários. Desejável disponibilidade para viagens.

não tem jeito de funcionar
publicado por Hunter - 2007-01-15 05:14:05

testei em 2 provedores diferentes aquela regrinha de tirar a extensão do index.php e não tem jeito de funcionar.

no primeiro só dá "The requested URL /index was not found on this server."

e no segundo provedor dá um bem grande "Internal Server Error".

Desisto.

performance
publicado por Celso Endo - 2007-09-20 14:36:46

alguém sabe me dizer a performance do mod_rewrite se tiver mais de 10000 (10 mil) regras num mesmo .htaccess?? todas as regras são simples e só muda uma string entre elas... alguém tem idéia?

errrrrrrrooooooooooooo
publicado por klawdyo - 2007-10-20 21:21:02

Não dá certo aqui.
Existe alguma configuração pro Apache?

Publique os seus Comentários

Nome:
Email:
Título:
Comentário:

NOTA: Cadastre-se no site para poder publicar comentários.

 
webmaster: João Prado Maia   © 2000 - 2005 phpbrasil.com
Gerado em 1.682 segundos