quinta-feira, 23 de outubro de 2008

Urls Amigáveis no PHP(Apache)

Mtas vezes o cliente ou o próprio programador deseja dar uma "enxugada" nas urls.
De modo que www.site.com?pagina.php?id=114&atr=nome&sessao=comentarios se torne algo como: www.site.com/comentarios/nome/114.


Para tanto nos usamos o mod_rewrite, o mod_rewrite é um módulo do servidor Apache que permite reescrevermos as urls.


Mas tem mais mnós não só reescrevemos elas como também tornamos imperceptível para o navegador,crawlers e spiders!


Nota: Crawlers e spiders são programas que vasculham a internet em busca de dados, com o google bot



Resumindo o artigo:
  • Para termos mod_rewrite devemos editar o .htacces que só deve ter esse nome e deve ficar na root do html;
  • Editando o htaccess devemos iniciar o mod_rewrite com RewriteEngine On;
  • Caso queiramos aplicar a regra apenas para alguns usamos RewriteCond;
  • Aplicamos a regra com RewriteRule REGEX Redirecionamento e Flags;
  • Usamos backreference que vem a ser o que a regex abriga para passar referência a pagina em si;
  • A Url fica imperceptível no lado cliente;
  • EXEMPLO Rápido:
    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^(artigos)(\/(.+)?)?$ /indexArtigos.php?tipo=ver&artigoNome=$3 [L]
    RewriteRule ^(editarArtigos)(\/(.+)?)?$ /indexArtigos.php?tipo=editar&artigoNome=$3 [L]

  • Exemplo para fingir que php é html
    RewriteEngine On
    RewriteRule ^(.*)\.htm /$1.php[L]


Iniciando, o arquivo .htaccess


o arquivo .htaccess é um arquivo que tem apenas este nome, não é algo.htaccess é apenas .htaccess, este arquivo deve ficar na pasta raiz de seu servidor ex: htdocs,www,public_html etc. Para certos servidores vc já tem um arquivo .htaccess lá, se for o caso o edite mas evite de deletar informações a não ser que saiba exatamente o que elas fazem!


A sintaxe do .htacces para mod_rewrite


Abaixo explicarei apenas as coisas mais usadas para maiores informações : http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html



  • Habilite o mod_rewrite RewriteEngine On OU RewriteEngine Off caso decida desabilitá-lo

  • Se desejado coloque condições RewriteCond String-de-Test Padrão-da-condição

  • Coloque a regra em si : RewriteRule Padrão Substituição


A sintaxe RewriteEngine é auto explicativa, abaixo explico em detalhes RewriteCond e RewriteRule


RewriteCond

Define a condição para que o mod_rewrite funcione, podemos utilizar variáveis com a sintaxe %{NOME-DA-VARIAVEL} em que as variaveis disponiveis são:


Variaveis RewriteCond

HTTP_HEADERS HTTP_USER_AGENT ,HTTP_REFERER ,HTTP_COOKIE ,HTTP_FORWARDED ,HTTP_HOST ,HTTP_PROXY_CONNECTION ,HTTP_ACCEPT


connection & request:REMOTE_ADDR ,REMOTE_HOST ,REMOTE_PORT ,REMOTE_USER ,REMOTE_IDENT ,REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING ,AUTH_TYPE


server internals: DOCUMENT_ROOT ,SERVER_ADMIN ,SERVER_NAME ,SERVER_ADDR ,SERVER_PORT ,SERVER_PROTOCOL ,SERVER_SOFTWARE


system stuff: TIME_YEAR ,TIME_MON ,TIME_DAY ,TIME_HOUR ,TIME_MIN ,TIME_SEC ,TIME_WDAY ,TIME


specials:API_VERSION ,THE_REQUEST ,REQUEST_URI ,REQUEST_FILENAME ,IS_SUBREQ ,HTTPS


A maioria das variáveis são nativas do apache, já documentadas em outro lugar exceto as specials:



  • IS_SUBREQ: Contem true ou false se é um sub_request

  • API_VERSION Versão do Apache module API

  • THE_REQUEST a http_request completa enviada ao servidor ex: GET /index.html HTTP/1.1 Não inclui headers adcionais como coisas enviadas por um form

  • REQUEST_URI a URI por exemplo index.html

  • REQUEST_FILENAME caminho para o script dentro do server como c:\xampp\htdocs\index.html

  • HTTPS contem "on" ou "of" dependendo de se estar usando SSL/TLS


Vc pode colocar um ! na condição para especificar o que NÃO deve bater na expressão


Flags rewrite Cond


  • -d se é um diretório

  • -f se é um arquivo comum(ex: txt,xml etc..)

  • -s arquivo comum com tamanho maior que 0

  • -l Link Simbólico

  • -D se é um diretório(Via sub-request)

  • -F se é um arquivo comum(Via sub-request)


OR e AND em RewriteCond

Normalmente ao se colocar uma regra como:


RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d


Teriamsos a seguinte interpretação Se ele NÃO É um arquivo comum E não é um diretorio


Caso nós queiramos um ou basta colocar o seguinte


RewriteCond %{SCRIPT_FILENAME} !-f[OR]
RewriteCond %{SCRIPT_FILENAME} !-s


Nesse caso a regra se aplica pra arquivos que Não Sejam arquivos comuns OU sejam arquivos comuns com tamaho maior que zero


Exemplo:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepageMoz.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepageLynx.html [L]
RewriteRule ^/$ /homepageOther.html [L]


essa condição bate se o usuário estiver usando mozilla vai pra uma pagina, lynx outra e o resto outra, ficara mais claro quando explicarmos a RewriteRule


RewriteRule

A RewriteRule usa expressões regulares(Regex), caso não saiba pesquise no google, talvez num futuro próximo escreva um artigo sobre isso, por hora suponho que vc entenda Regex


Sintaxe Básica

RewriteRule ^(admin)(\/(\w+)?)?$ /adminArea/admin.php?pagina=$3


no caso acima utilizamos a seguinte regra quando o usuario digitar /admin ou /admin/QUALQUER-LETRA ele sera direcionado para a pagina /adminArea/admin.php?pagina=$3 com o conteudo na parte de texto indo para a variavel GET pagina. Isso é feito por backreferences em que o numero em $ indica o numero do que pegamos com a expressão no nosso caso ,em que $0 é a expressão todo $1 seria admin $2 seria admin/qlqr-letra e $3 qualquer-letra


Algumas flags interessantes para RewriteRule


  • F OU forbidden lança para uma pagina com o erro 403 exemplo:
    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteRule ^.* /paginaProibida.php[F]
    OU
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteRule ^.* /paginaProibida.php[forbidden]
    O exemplo acima lança para qualquer Diretorio pra paginaProibida.php com o erro 403 enviado ao browser



  • L OU last não aplica mais regras como no exemplo
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
    RewriteRule ^/$ /homepageLynx.html [L]
    Que não passaria pras regras subsequentes

  • N ou next Repassa as regras para o inicio das regras agora com a url ja modificada pela ultima rewrite rule



É isso para maiores referências pesquise urls açucaradas,urls amigaveis ou vá na página do mod_rewrite http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Nenhum comentário: