URLs amigáveis – esclarecendo dúvidas

Tenho recebido diversos emails de pessoas que leram meu artigo sobre URLs amigáveis e não entenderam muito bem o processo.

Vou tentar explicar um pouco melhor esse processo.

A primeira coisa que precisa ficar clara é que o google — assim como qualquer outra search engine — não tem acesso aos arquivos dinâmicos do seu site. Os spiders acessam apenas o código (X)HTML gerado por eles.

É importante entender que um spider é como um usuário qualquer. A diferença é que ele é uma ferramenta automatizada que percorre os links que encontra e cria um índice que será usado pelo sistema de busca.

Outra coisa que também precisa ser entendida é que os spiders associam um recurso (uma página HTML, por exemplo) com a URL usada para chegar até ele. Exemplificando: digamos que você decida usar o mod_rewrite para criar URLs amigáveis.

Sendo assim, uma página que antes seria acessada pela URL www.seusite.com/index.php?data=01-02-2005&nome =meu-artigo1 agora será acessada por www.seusite.com/01/02/2005/meu-artigo. A URL antiga continuará funcionando e o google só passará a listar a nova URL se todos os links para a referida página forem atualizados para a nova URL.

A troca — ou reescrita — das URLs é feita pelo apache de maneira transparente ao usuário, portanto, apenas o servidor
tem conhecimento desta reescrita. O usuário, assim como o spider, não consegue perceber este processo.

Reescrita de URL é diferente de redirecionamento. Um redirecionamento informa ao user agent (browser, spider, leitor de tela, etc) que um recurso encontra-se acessível por outra URL. O user agent aponta para a nova URL e acessa o recurso. O processo de redirecionamento não é transparente ao usuário.

Já a reescrita (feita pelo mod_rewrite) é um processo interno ao servidor web. Este analisa uma regra de reescrita (RewriteRule)
existente em um arquivo .htaccess, executa um redirecionamento e entrega o recurso ao user agent sem informar uma nova URL.
Vou tentar explicar com um exemplo:

Consideremos a URL citada acima: www.seusite.com/index.php?data=01-02-2005&nome=meu-artigo1. Esta URL chama um script PHP, com duas variáveis e seus respectivos valores. O script executa alguma ação com esses valores (lê os dados de um banco de dados, por exemplo) e entrega ao user agent um documento HTML.

Para reescrever essa URL para www.seusite.com/01/02/2005/meu-artigo podemos usar a seguinte regra de reescrita:

RewriteEngine On #Liga o mecanismo de reescrita (mod_rewrite)
RewriteRule ^([0-9]+)\/([0-9]+)\/([0-9]+)\/([A-Za-z-]+)$ /index.php?data=$1-$2-$3&nome=$4

Explicar a regra acima está fora do escopo deste artigo. Leia o artigo Gerenciamento de URLs – Criando URLs amigáveis.

O que quero deixar claro é como o apache vai executar esta tarefa.

O arquivo .htaccess é processado pelo apache toda vez que ele acessa um arquivo dentro do diretório onde ele (o .htaccess) se encontra. Quando um usuário tentar acessar a URL www.seusite.com/01/02/2005/meu-artigo o apache vai casar o padrão desta URL com a expressão regular presente na RewriteRule. Havendo compatibilidade — e neste caso há — ele vai verificar a segunda parte da regra (/index.php?data=$1-$2-$3&nome=$4) e fazer uma requisição ao arquivo com as substituições necessárias (no caso /index.php?data=01-02-2005&nome=meu-artigo). O script vai realizar as operações necessárias para gerar o conteúdo HTML e o apache entregará este conteúdo direto ao user agent. Processo transparente, lembra-se?

Mais uma vez, para essa troca de URL fazer alguma diferença nos sites de busca é necessário que se troquem todas as referências. Ou seja, trocar <a href=”http://www.seusite.com/index.php?data=01-02-2005&nome=meu-artigo”>Meu artigo</a>1 por <a href=”http://www.seusite.com/01/02/2005/meu-artigo”>Meu artigo</a>.

Outra coisa importante são os links vindos de outros sites. Se você puder, peça aos administradores dos sites para trocarem os links.

Espero com este texto ter esclarecido as dúvidas que restaram sobre mod_rewrite e URLs amigáveis. Se houver algum ponto que não tenha sido esclarecido, por favor, comentem.

[1] O espaço antes do ‘=’ foi incluído para proporcionar quebra de linha quando necessário e não faz parte da URL.

Leia também:

61 Comentários sobre “URLs amigáveis – esclarecendo dúvidas”

Faça um comentário

#1 | misael

Bruno, muito bom o artigo, era um desse em português que estava faltando (a net ta recheada de arquivos falando disso, mas em inglês). Só uma coisa, se somente eu fizer as alterações de referências não basta? Porque caso mais alguém aponte vai ser apenas mais uma referência e como a antiga URL não-amigável não era lida pelo google, para ele, ela simplesmante não existe. Correto?

Abraços.


#2 | Misael

Mais uma coisa, Bruno você talvez já saiba que este método ainda não evita que alguém saiba que seu site usa PHP, já que basta adicionar ?=PHPE9568F34-D428-11d2-A769-00AA001ACF42

a qualquer script PHP que ele mostra o logo [é esse método que o phpinfo() usa para mostrar o logo quando é chamado]. Exemplo:

http://www.brunotorres.net/web/urls-again?=PHPE9568F34-D428-11d2-A769-00AA001ACF42

Talvez fosse interessante adicionar no seu .htaccess um código pra evitar isso [to sem o menor saco pra escrever uma ER, alguém faz e posta ae blz?]

Valeu galera!


Misael,

Sim, eu já sabia disso. Mas não me preocupa. Eu gosto de ter URLs amigáveis não por segurança mas por praticidade mesmo.

Sobre as referências, se a URL antiga continuar funcionando, as referências a ela vão continuar valendo e o google vai continuar indexando.


Bruno, criei o arquivo .htaccess na raiz de meu site com as linhas.

RewriteEngine On

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

estou usando layout.php?s=card&id=1 exemplo

pelo que eu entendi deveria funcionar tipo, guifm.com/sgu/card/1

mas nem mesmo abre nenhum arquivo da pasta /sgu

agradeco desde ja


Consegui pode deletar os posts…


Mto bom o artigo, a tempos que vinha procurando uma solução !


Prezados colegas,

Estou tentando implementar a solução apontada por este artigo mas não estou conseguindo.

Estas regras aplicam-se apenas ao Apache2 ou o Apache/1.3.33 tambem funciona sem problemas com esta regra de reescrita postada aqui?

Grato pela atenção.


Para Bruno e Guilherme,

Bruno, eu enviei um e-mail para você solicitando mais informações sobre a reescrita de URLs… fiquei muito contente quando recebi o link com mais este artigo e parabéns, esta muito bem escrito.

Guilherme, vc teve problemas inicialmente para fazer isto funcionar. Poderia dizer qual foi o seu problema e qual foi a solução encontrada?

Abraços


Para Bruno e Guilherme,

Bruno, eu enviei um e-mail para você solicitando mais informações sobre a reescrita de URLs… fiquei muito contente quando recebi o link com mais este artigo e parabéns, esta muito bem escrito.

Guilherme, vc teve problemas inicialmente para fazer isto funcionar. Poderia dizer qual foi o seu problema e qual foi a solução encontrada?

Abraços


Muito legal! Eu só tive um problema que foi que eu acho que o Apache começa do diretório inicial ou alguma coisa do tipo. Ao invés de escrever:

<pre>RewriteRule ^link/(.*)$ /index.php?l=$1</pre>

Eu tive que escrever:

<pre>RewriteRule ^link/(.*)$ http://tableless.tiagomadeira.net/index.php?l=$1&lt;/pre&gt;

Mas funcionou perfeitamente.


#11 | Jura

Essa técnica realmente é muito boa..fiquei conhecendo ela através do site aqui do Bruno, mas tive muita dificuldade pra implementar isso,mas já estou me virando melhor.Em dessas pesquisas pela net achei esse site:

http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml .Muito bom, pra quem tá começando..ele gera o código pra você numa boa.


#12 | Jura

Essa técnica realmente é muito boa..fiquei conhecendo ela através do site aqui do Bruno, mas tive muita dificuldade pra implementar isso,mas já estou me virando melhor.Em dessas pesquisas pela net achei esse site:

http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml .Muito bom, pra quem tá começando..ele gera o código pra você numa boa.


consegui galera, muito obrigado.


nao abre erro ou nao encontra osite no meu pc privado


nao abre erro ou nao encontra osite no meu pc privado


#16 | alexandre

quero criar um link no apache mas não concigo, como fasso

Grato

Alexandre


Meu apache só aceita entrar em diretórios quando coloco basrra no final, como modifico?

Ex: http://www.site.com/x não entra mas http://www.site.com/x/ já entra….


#18 | MARCELO AUGUSTO SILVA GALVAO

QUERO SABER COMO MUDO A URL , JA QUE NÃO É PERMITIDO ACESSAR ALGUNS SITES AQUI NA FACUL


#19 | Nei Rauni Santos

interessante esses artigos sobre o mod_rewrite, parabéns!


Bruno e seus mod_rewrite’s… :)
Ótimo artigo cara, parabéns.


Ótimo artigo. Não sabia fazer isso, semprevia o WordPress fazendo e tinha curiosidade de como. Ótimo artigo. ;)


#22 | Willian Spagnol

Parabéns pelos seus artigos, são show de bola! Com essa dica do mod_rewrite dá para fazer muita coisa mesmo.


[...] Bom dia. Mais uma vez estou madrugando. Mas vamos lá. Se você é daqueles que vêem a URL do meu blog, por exemplo, em .html e não acreditam que o blog esteja em PHP você deve dar uma lida neste bom artigo do Bruno Torres. [...]


[...] URLs amigáveis – esclarecendo dúvidas [...]


veja se alguém pode me ajudar, não sei se entendi diretio, cirei o arquivo .hatccess com o conteúdo para testar

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

depois crieis uma página index.php com o conteúdo
para teste

Teste

Teste Teste 2

mas não consigo obter o resultado desejado…


a página que criei em php é esta, no post acima não apareceu…

html
head
title Teste title
head
body

a href=”/web/1″Teste/a a href=”/web/2″Teste 2/a

?php if(isset($s)) {
echo $s . $p;
}
?

/body
/html


misael

depois vc faz para este daqui também

?=PHPE9568F35-D428-11d2-A769-00AA001ACF42

isso tem haver com o phpinfo() e só da um aolhadinh amais atenta!

http://brunotorres.net/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42


#28 | Paulo Jr

veja só, tentei fazer o esquema do .htaccess.. mas ao enviar o arquivo para o servidor, cai a página..

“The server encountered an internal error or misconfiguration and was unable to complete your request. Your administrator may not have enabled CGI access for this directory.”

creio eu, que devo checar com o provedor sobre o mod_rewrite.

estou certo?


ola, tem como fazer com esta tecnica um modulo de redirecionamneto!

tipo

http://www.meusite.com.br/erick/

ficaria assim
htpp://erick.meusite.com.br

vlw!!


#30 | felipe

Bom, eu nunca vi alguem responder a perguntas aqui, mas aparece no meu server esta msg:

Internal Server Error

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

Please contact the server administrator, you@example.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.

meu .htaccess

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


#31 | Jáder tavares

O mais legal de tudo isso que só funciona no Linux e pra min que sou desenvolvedor me ferra né faze o que… fica mudando de sistema operacional só pra desenvolver isso não rola..acredita que tenha outro modo de fazer isso usando windows, mas ainda não encontrei.
se alguém puder me ajudar.

Valewww


#32 | Felipe

Tem condições de fazer mais de uma regra?
Tipo:

RewriteEngine On
RewriteRule ^saber/([^/]*)$ /ler.php?id=$1 [L]
RewriteRule ^buscar-saber/([^/]*)$ /buscar.php?q=$1 [L]

O sódigo acima não funciona.
Aguardo.


#33 | Alan

Parabéns pelo artigo!
Tenho uma dúvida!
Por exemplo, em meu site, tenho uma página a qual podem ser passados parâmetros ou não, ficando assim:
- pagina.php OU
- pagina.php?var=teste OU
- pagina.php?var=teste&var2=outroteste

E tenho tido problemas na hora de criar o htaccess, porque ou proibe acesso ao site/pagina, ou ao site/pagina/teste

Ficaria feliz se pudesse me ajudar!

Abraços!


Eu queria fazer assim http://www.letrasdemusicas.biz/madison_avenue/ e não assim http://www.letrasdemusicas.biz/madison avenue/ mas quando coloco o underline dá erro! Álguém pode me ajudar? Eu tive que usar o ID http://www.letrasdemusicas.biz/2900_madison-avenue mas fica tão chato pois se o ID mudar já era!


Parabéns pelo artigo com certeza vai ajudar muita gente na Internet!


#36 | leo

simplesmente d+ … me ajudou muito … abraços


parabéns ! artigo super importante para todos … um abraço


Como é difícil encontrar artigos com tanta clareza ,,, parabéns


Eu gostaria de aprender mais um pouco sobre o esclarecendo que e de Ciencias e tambem que e da escola.
Assinada Priscila Brga Santos.
Terca-feira dia 28 de novembro de 2006.
Unai Minas Gerais.


#40 | Bill

show de bola, gostei


Realmente artigo muito bom…parabéns


[...] artigos do Bruno Torres Gerenciamento de URLs – Criando URLs amigáveis e URLs amigáveis – esclarecendo dúvidas falam mais sobre essa técnica, mas servem apenas para usuários do servidor web Apache [...]


[...] BrunoTorres.net – URLs amigáveis – esclarecendo dúvidas [...]


#44 | Leandro José Biesek

olá a todos e parabéns Bruno, seu tutorial foi de grande ajuda, mas tenho uma pequena duvida: no arquivo .htaccess pode haver mais de uma linha de Rewrite Rule?

Grato pela atenção.

Atenciosamente,
Leandro


#45 | Flaudizio

Parabéns pelo artigo, só me ficou uma dúvida, eu posso ter mais de uma RewriteRule no arquivo .htaccess ?

Obrigado.


#46 | Diego

Olá Bruno,

Ótima matéria e explicação.
Entretanto uma dúvida permanece (me corrija se eu estiver fazendo confusão):
- Minhas páginas dinâmicas estão criadas considerando o id das minhas notícias e as chaves estrangeiras de cada relacionamento das minhas tabelas. Ex.: noticias.php?id=59&cat=22.
Já entendi como se cria o regex para o htaccess. O que não entendi é como vou criar uma referência ‘decente’ para minha matéria, baseando-se do fato que não utilizo o título da notícia como chave primária… Ao meu ver, “noticias/59/22″ não é agradável…. Poderia esclarecer?
grato


Olá amigo. o seu artigo foi muito util. Implementei o redirecionamento no .htaccess como vc me falou no portal http://opiniaoweb.com . Gostei muito do resultado. Muito obrigado. Precisando de ajuda eh soh falar!


[...] quem quer ler mais sobre o assunto, Pode ver mais detalhadamente aqui e aqui. > Sem Avaliações. Vota ai vai!  Loading …    2 [...]


Estou com a mesma dúvida do Allan, do post 33 !


#50 | Luis carlos

Olá Bruno, estou entrando nesse mundo das URLs Amigáveis agora, e fiz um teste com um site meu e aparentemente ele funciona, mas não lê o CSS, a página fica toda desconfigurada, vc saberia me dizer como eu resolvo isso?
Atualmente uso PHP + SMARTY desde já agradeço.


[...] Aqui você pode encontrar alguma coisa, e nesse outro mostra até em video entre e confiram! [...]


> Luis carlos

Eu consegui resolver isso sem sacrifícios usando a metatag BASE na página que recebe o mod_rewrite, que desfigura, ficando assim:

Ae ele vai chamar seu CSS, JS, ou que seja, certinho, sem trocar caminhos de arquivos.

Abraços


E se minha url conter caracteres especiais do tipo “?” , “!”, ou uma frase assim:

/noticias/id/Como funcionam os links patrocinados do Google (adwords) ?

A página atualmente nos testes lê Como%20funcionam%20os%20links%20patrocinados%20do%20Google%20(adwords)%20?

E dá erro, não abre a página, se eu uso [^/]* para interpretar a frase, lê normalmente, igual a url de cima, e funciona.


#54 | wpdm

tipo queria saber tipo o site e assim
wpdm.cavernanet.com.br/new/index.php?id=1

queria qq fosse

wpdm.cavernanet.com.br/new/id/1

como seria o mode rewrite?
agradeço


Como faço para pegar uma url dinamica exemplo: index.php?s=DVD&p=DVD, e reescreve para outra url dinamica exemplo teste.php?s=DVD&p=DVD, preciso saber disto porque a url que será reescrita (teste.php) contém uma função que cria um link a partir das informações dinamicas e redireciona, este link é adicionado novas informações nesta página, exemplo (DVD-DVD-todos-os-dvds.html) por isso a nescessidade de reescrever em um link dinamico, depois ele é redirecionada para esta url amigável (DVD-DVD-todos-os-dvds.html) que por sua vez téra uma reescrita também especifica para ela. É possivel?


#56 | Henrique

Muito bom cara… apanho um pouco com expressões regulares… por exemplo, tenho a URL.

http://site.com/brasil/ceara/fortaleza/centro

Minha dúvida é, como fazer para que os parâmetros sejam opcionais? Porque eu posso quere somente

http://site.com/brasil/

ou

http://site.com/brasil/ceara/

ou

http://site.com/brasil/ceara/fortaleza/

ou somente

http://site.com/brasil/ceara/fortaleza/centro

Quando puder me responder agradeço.


Olá a todos e muito obrigado por esta materia!

Estou com a implementação praticamente parada.
Gostaria de saber como passar a string “?titulo=Teste 1″…
Porem Substitundo letras maiusculas por Minusculas e espaço por (-)…

Se alguem puder me ajudar, desde já agradeço.

Mateus


#58 | Cristiano

legal o post, mas estou com uma duvida
entrei em um site, e no site vc pode modificar o link que ele gera do mesmo jeito,ex:
rionegroesolimoes.letrasdemusicas.com.br
chitaozinhoexororo.letrasdemusicas.com.br
zecapagodinho.letrasdemusicas.com.br

etc,, é o mesmo sistema,, e qual é o codigo do .htacess pra isso? valew


#59 | José Carlos

Sou José Carlos. Sou novo com web, uso Wordpress. Gostaria de saber uma coisa: tem como usando .htaccess da pra modificar a URL http://www.site.com.br/2009/04/03/nome-do-post para http://www.site.com.br/index.php?ano=2009&mes=04&dia=03&post=nome-do-post ?


#60 | Leandro

Bruno,
Tudo bom?
Estou com dois probleminhas
1) as Imagens do site não carregão
2) não consigo acessar os diretórios do projeto

codigo usado:

# -FrontPage-

IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

order deny,allow
deny from all
allow from all

order deny,allow
deny from all

AuthName manhuacuauto.com.br
AuthUserFile /home/mcuautos/public_html/_vti_pvt/service.pwd
AuthGroupFile /home/mcuautos/public_html/_vti_pvt/service.grp

#até aqui é padrão do server

#Executa se o módulo estiver carregado no servidor

#Habilita o Módulo de Reescrita
RewriteEngine On

#Se a URL apontar para um arquivo, vai diretamente para ele
RewriteCond %{REQUEST_FILENAME} !-f
#Se a URL apontar para uma pasta, vai diretamente para ela
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^artigo/([^/]*)(/([^/]*)/?)?$ artigo.php?cod=$1&pag=$2 [L]
RewriteRule ^([^/]*)/([^/]*)(/([^/]*)/?)?$ $1.php?cod=$2&pag=$4 [L]


#61 | Michel

Olá Pessoal estou a com a seguinte dúvida, coloquei o quero transformar a seguinte URL:
http://localhost/br/moveis/produto.php?cdproduto=3
Tranformar em:
http://localhost/br/moveis/produto/3

meu .htacess está dentro do diretorio localhost/br/moveis e está desta forma:

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.html$ /$1.php?cdproduto=$2

Não está funcionando, já tentei de tudo li em um monte de sites mas nada acontece. Estou desesperado já. Abraço.


«

»

Deixe seu comentário


Veja as estatísticas