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:
Postar um comentário