ISAPI REWRITE é um mecanismo de reescrita que modifica a aparência de uma URL da web ,cria regras e extensões que são executadas antes de um servidor web mostrar o conteúdo solicitado por um usuário. São controladas por eventos do servidor não por requisições do cliente. Aqui algumas ótimas referencias de estudo sobre o assunto, http://www.isapirewrite.com/, http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html.
Podemos por exemplo, mudar uma URL assim:
http://exemplo.com.br/teste/index.asp?titulo= titulo_pagina
Para:
http:// exemplo.com.br/ teste / titulo_pagina Um Fórum pode ter uma URL que codifica as datas de cada entrada:
http://www.site.com.br/Forum/Posts.asp?Dia=11&Mes=04&Ano=2011
Ela pode ser alterada como esta:
http://www. site.com.br/Forum /11/04/2011/
que também permite ao usuário alterar a URL para ver todos os lançamentos disponíveis em abril, basta remover a codificação de texto no dia ’11 ‘, como se a navegação fosse “para cima” de um diretório:
http://www. site.com.br/Forum/04/2011/
# proteção hotlink
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://1.*).*
RewriteRule .*.(?:gif|jpg|png) /block.gif [I,O]
Para esta expressão protegemos todos os formatos de arquivos com extensão gif, jpg e png. Você pode proteger outros formatos adicionando-os na última linha do código.
Instalando
Para a instalação necessitamos ter controle total de um servidor local ou próprio se a instalação for em um servidor compartilhado, utilize o painel de controle, geralmente por um botão de comando ativar/desativar, ou então por uma solicitação no helpdesk.
Vamos criar regras básicas, para facilitar o entendimento e absorção do material e neste caso, vamos criar uma regra para cada arquivo.
O site que vamos utilizar como exemplo para implementar as URL’s amigáveis tem as seguintes páginas: home.asp, empresa.asp, produtos.asp, contato.asp
A pagina de home é uma pagina dinâmica, que recebe até 3 parâmetros: id do produto, categoria e quantidade (em caso de paginação). Ou seja, a pagina de noticias é acessada da seguinte maneira:
HTTP://www.site.com.br/home.asp?categoria=15&idproduto=23&quantidade=3
Logo, a regra deverá ser:
RewriteRule ^/preco/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)-([0-9]+),([0-9]+),([0-9]+)/?(.html)?$ /home.asp? categoria =$3&idproduto=$4&quantidade=$5 [I,L] |
Esta é regra a conversão do link acima, que retornará o seguinte endereço:
HTTP://www.site.com.br/home/informatica/mouse-otico-15,23,3.html
Para as demais paginas, que não recebem parâmetros as regras ficarão mais simples, veja:
RewriteRule ^/default/?([a-zA-Z0-9_-]+)?(.html)?$ /default.asp [I,L] |
|
RewriteRule ^/quemsomos/?([a-zA-Z0-9_-]+)?(.html)?$ /empresa.asp [I,L] |
|
RewriteRule ^/servicos/?([a-zA-Z0-9_-]+)?(.html)?$ /produtos.asp [I,L] |
|
RewriteRule ^/contato/?([a-zA-Z0-9_-]+)?(.html)?$ /contato.asp [I,L] |
|
Depois que as regras foram mapeadas e concluídas, e todas paginas já estão funcionando com a utilização do ISAPI REWRITE, chega a hora então e apontar os links internos do site para a novo formato do link. Vamos efetuar uma busca no site por todas as ocorrências da tag “<a>…</a>”. Localize e abra todos os arquivos que contenha a sintax “<a href=”.
Com os links já localizados, faça a modificação do código tomado como exemplo. Troque:
<a href="home.asp?c=15&Categoria=23&quantidade=3">Titulo Notícia</a> |
Por:
<a href="<%=URLamigavel("home.asp?v=15&idCategoria=23& quantidade =3","nome da Categoria","Titulo Noticia")%>">Titulo Notícia</a> |
Para que o site permaneça funcionando, basta criar uma função que retorne o mesmo valor. Assim também é possível manter o site funcionando caso ocorre algum problema com o servidor ou com a própria aplicação.
Function URLamigavel(param) |
|
URLamigavel = param |
|
End Function |
Precisaremos então de uma função que converta os links atuais, para os novos formatos de links. Na sua biblioteca de funções cria as seguinte funções:
<pre>Function urlAmigavel(pag, ByVal cat, ByVal tit) |
||
dim URL, arquivo, parametros, sField, sValue, valor |
||
URL = "http://www.site.com.br/" |
||
If InStr(pag, ".asp" ) > 0 Then |
||
arquivo = Left( pag, ( InStr(pag, ".asp" ) -1) ) |
||
If InStr(pag, "?" ) Then |
||
parametros = Split( Right( pag , Len(pag) - InStr(pag, "?" ) ) , "&") |
||
For j = 0 To UBound( parametros ) |
||
sField = left ( parametros(j) , InStr( parametros(j) , "=") -1 ) |
||
sValue = Right( parametros(j) , Len(parametros(j)) - InStr( parametros(j) , "=") ) |
||
if valor = "" Then valor = sValue Else valor = valor &","& sValue End If |
||
Next |
||
End if |
|
End if |
If tit <> "" then |
||
tit = "/"& FormataTitulo( tit ) |
||
If cat <> "" then |
||
cat = "/"& FormataTitulo( cat ) |
||
End if |
||
Else |
||
tit = "/" |
||
End if |
||
If valor <> "" Then valor = "-" & valor&".html" End If |
||
urlAmigavel = URL & arquivo & cat & tit & valor |
||
End Function |
||
'--------------------------------------------------------------- |
||
Function ereg_replace(ByVal ereg_vetor, ByVal repl, ByVal valor) |
||
<pre> ereg_vetorV = Split(ereg_vetor, "-") |
||
If ubound(ereg_vetorV) > 0 Then |
||
charName = Split(ereg_vetorV(0),"|") |
||
For i_ereg = 0 To UBound(charName) |
||
valor = Replace(valor, charName(i_ereg), repl) |
||
Next |
||
If UBound(ereg_vetorV) >= 1 then |
||
charID = Split(ereg_vetorV(1),"|") |
||
If Join(charID) <> "" then |
||
For i_ereg = 0 To UBound(charID) |
||
valor = Replace(valor, "&#" & charID(i_ereg) & ";", repl) |
||
Next |
||
End if |
|
End if |
End If |
||
ereg_replace = valor |
||
End Function |
||
Function FormataTitulo( ByVal s ) |
||
s = Trim(s) |
||
s = LCase(s) |
||
s = ereg_replace("á|à|â|ã|ä|ª-@|224|225|226|227|228|229","a",s) |
||
s = ereg_replace("é|è|ê|ë-232|233|234|235","e",s) |
||
s = ereg_replace("í|ì|î|ï-236|237|238|239","i",s) |
||
s = ereg_replace("ó|ò|ô|õ|º|ö-242|243|244|245|246|186","o",s) |
||
s = ereg_replace("ú|ù|û|ü-249|250|251|252","u",s) |
||
s = ereg_replace("ç-231","c",s) |
||
s = ereg_replace("ñ","n",s) |
||
s = replace(s , "-", "") |
||
s = replace(s , "&", "") |
||
s = replace(s , " ", "-") |
||
s = replace(s , ",", "") |
|
s = replace(s , "?", "") |
s = replace(s , ":", "") |
|
s = replace(s , "/", "") |
s = replace(s , ".", "") |
|
s = replace(s , "'", "") |
s = replace(s , "´", "") |
||
s = replace(s , """, "") |
||
s = replace(s , "$", "s") |
||
s = replace(s , "!", "") |
||
s = replace(s , "%", "") |
||
FormataTitulo = s |
||
End Function</pre> |
Abaixo alguns metacaracteres, com o seu significado entre parêntesis a seguir:
• . (qualquer caractere)
• * (zero ou mais precedentes)
• + (uma ou mais precedentes)
• {} (mínimo ao máximo quantificador)
• ? (modificador ungreedy)
• ! (no início da string significa “padrão negativo “)
• ^ (início da seqüência de caracteres, ou “negativo” se no início de uma série)
• $ (final da string)
• [] (corresponde a nenhum conteúdo)
• - (intervalo se usado entre colchetes)
• () (grupo, de volta referenciado)
• | (alternativa, ou)
• \ (o próprio caractere de escape)
Usando expressões regulares, é possível pesquisar por todos os tipos de padrões de URLs e reescrevê-los quando eles coincidem. Hora para um outro exemplo – que queríamos antes de ser capaz de identificar essa URL e reescrevê-lo:
http://www.site.com.br/ araras/brasil-azul/
Vamos fazer o servidor interpretar isso como o seguinte, mas para todos os produtos:
http://www. site.com.br /produto_por_nome.asp?produto_nome= brasil-azul
E podemos fazer isso de forma relativamente simples, com a seguinte regra:
RewriteRule ^ araras/([A-Za-z0-9-]+)/?$ produto_por_nome.asp?produto_nome =$1 [NC,L] # Processo araras
Com essa regra, qualquer URL que começa com ” araras “, seguido por uma barra (araras /), então um ou mais (+) em qualquer combinação de letras, números e hífens ([A-Za-z0-9]) ( Observe o hífen no final da seleção de caracteres entre colchetes – que deve ser adicionado lá para ser tratado, literalmente, ao invés de como um separador de intervalo),nome do produto de referência entre parênteses, com $1 na substituição.
Podemos fazer ainda mais genérica, se queremos, de modo que não importa o diretório de um produto, assim:
RewriteRule ^ [A-Za-z-]+/([ produto_por_nome.asp A-Za-z0-9-]+)/?$ ? produto_nome = $ 1 [NC, L] # Processa todos os produtos
Como você pode ver, temos substituído ” araras” com um padrão que combina letras e hífens. Essa regra será para diretório araras ou qualquer outro diretório cujo nome é composto de pelo menos uma ou mais letras e hífens.
Flags
Flags são adicionados ao final de uma regra como interpretar e lidar com a regra. Elas podem ser usadas para tratar a regra como case-sensitive, para parar regras de processamento, e os one matches atual, ou uma variedade de outras opções. Eles são separados por vírgula, e entre colchetes. Aqui está uma lista das Flags, com seus significados (esta informação é incluído no cheat sheet).
• C (acorrentado com a regra seguinte)
• CO=cookie (set cookie especificado)
• E=var:value (var conjunto variável de ambiente para o valor)
• F (forbidden [proibido] – envia um cabeçalho de 403 para o usuário)
• G (gone [se foi] – não existe mais)
• H=handler (conjunto manipulador)
• L (last – deixar de regras de processamento)
• N (next – continua regras de processamento)
• NC (case insensitive)
• NE (n ão escapar caracteres especiais na URL de saída)
• NS (ignorar esta regra se o pedido é um SUBPEDIDO)
• P (proxy – ou seja, o Apache deve pegar o conteúdo remoto especificado na seção de substituição e devolvê-lo)
• PT (passar – use quando URLs com os manipuladores de processamento adicional, por exemplo, mod_alias)
• R (temporária redirecionar para nova URL)
• R=301 (redirecionamento permanente para nova URL)
• QSA (query string de pedido de URL substituído)
• S=x (ignorar as regras ao lado x)
• T=mime-type (força especificada tipo mime)
Exceções e casos especiais
As condições podem ser testadas em algumas maneiras diferentes ,elas não precisam ser tratadas como padrões de expressões regulares, embora esta seja a maneira mais comum de serem usadas. Aqui estão as várias maneiras reescrever conditons pode ser processado:
•Pattern (seqüência de teste é maior do padrão)
• =Pattern (seqüência de teste é igual ao padrão)
• -d (seqüência de teste é um diretório válido)
• -f (seqüência de teste é um arquivo válido)
• -s (seqüência de teste é um arquivo válido com tamanho maior que zer)
• -l (eqüência de teste é um link simbólico)
• -F (seqüência de teste é um arquivo válido e acessível (via SUBPEDIDO))
• -U (seqüência de teste é uma URL válida, e acessíveis (via SUBPEDIDO))
Variáveis de Servidor
Variáveis do servidor são uma seleção de itens que você pode testar quando estiver a escrever reescrever condições. Isto permite-lhe aplicar as regras com base em todos os tipos de parâmetros da requisição, incluindo os identificadores navegador, URL de referência ou uma infinidade de outras seqüências. As variáveis são do seguinte formato:
% {variable_name}
• HTTP Headers
o HTTP_USER_AGENT
o HTTP_REFERER
o HTTP_COOKIE
o HTTP_FORWARDED
o HTTP_HOST
o HTTP_PROXY_CONNECTION
o HTTP_ACCEPT
• Variáveis Connection
o REMOTE_ADDR
o REMOTE_HOST
o REMOTE_USER
o REMOTE_IDENT
o REQUEST_METHOD
o SCRIPT_FILENAME
o PATH_INFO
o QUERY_STRING
o AUTH_TYPE
• Server Variables
o DOCUMENT_ROOT
o SERVER_ADMIN
o SERVER_NAME
o SERVER_ADDR
o SERVER_PORT
o SERVER_PROTOCOL
o SERVER_SOFTWARE
• Data e Hora
o TIME_YEAR
o TIME_MON
o TIME_DAY
o TIME_HOUR
o TIME_MIN
o TIME_SEC
o TIME_WDAY
o TIME
• Itens Especiais
o API_VERSION
o THE_REQUEST
o REQUEST_URI
o REQUEST_FILENAME
o IS_SUBREQ
Exemplo de regras
Para redirecionar um domínio antigo para um novo domínio:
RewriteCond %{HTTP_HOST} velho_dominio\.com [NC] RewriteRule ^(.*)$ http://www.novo_dominio.com /$1 [L,R=301]
Para redirecionar todas as solicitações faltando “www” (sim www):
RewriteCond %{HTTP_HOST} ^dominio\.com [NC] RewriteRule ^(.*)$ http://www.dominio.com/$1 [L,R=301]
Para redirecionar todas as solicitações com “www” (sem www):
RewriteCond %{HTTP_HOST} ^www\.dominio\.com [NC] RewriteRule ^(.*)$ http:// dominio.com/$1 [L,R=301]
Redirecionar página antiga para a nova página:
RewriteRule ^old-url\.htm$ http://www.dominio.com/nova-url.htm [NC,R=301,L]
[size="1"][font="Garamond"]
Fonte: vários sites e URL´s citadas no próprio post.[/font][/size]Abaixo alguns metacaracteres, com o seu significado entre parêntesis a seguir:
• . (qualquer caractere)
• * (zero ou mais precedentes)
• + (uma ou mais precedentes)
• {} (mínimo ao máximo quantificador)
• ? (modificador ungreedy)
• ! (no início da string significa “padrão negativo “)
• ^ (início da seqüência de caracteres, ou “negativo” se no início de uma série)
• $ (final da string)
• [] (corresponde a nenhum conteúdo)
• - (intervalo se usado entre colchetes)
• () (grupo, de volta referenciado)
• | (alternativa, ou)
• \ (o próprio caractere de escape)
Usando expressões regulares, é possível pesquisar por todos os tipos de padrões de URLs e reescrevê-los quando eles coincidem. Hora para um outro exemplo – que queríamos antes de ser capaz de identificar essa URL e reescrevê-lo:
http://www.site.com.br/ araras/brasil-azul/
Vamos fazer o servidor interpretar isso como o seguinte, mas para todos os produtos:
http://www. site.com.br /produto_por_nome.asp?produto_nome= brasil-azul
E podemos fazer isso de forma relativamente simples, com a seguinte regra:
RewriteRule ^ araras/([A-Za-z0-9-]+)/?$
produto_por_nome.asp?produto_nome =$1 [NC,L] # Processo araras
Com essa regra, qualquer URL que começa com ” araras “, seguido por uma barra (araras /), então um ou mais (+) em qualquer combinação de letras, números e hífens ([A-Za-z0-9]) ( Observe o hífen no final da seleção de caracteres entre colchetes – que deve ser adicionado lá para ser tratado, literalmente, ao invés de como um separador de intervalo),nome do produto de referência entre parênteses, com $1 na substituição.
Ppodemos fazer ainda mais genérica, se queremos, de modo que não importa o diretório de um produto, assim:
RewriteRule ^ [A-Za-z-]+/([ produto_por_nome.asp A-Za-z0-9-]+)/?$? produto_nome = $ 1 [NC, L] # Processa todos os produtos
Como você pode ver, temos substituído ” araras” com um padrão que combina letras e hífens. Essa regra será para diretório araras ou qualquer outro diretório cujo nome é composto de pelo menos uma ou mais letras e hífens.
Flags
Flags são adicionados ao final de uma regra como interpretar e lidar com a regra. Elas podem ser usadas para tratar a regra como case-sensitive, para parar regras de processamento, e os one matches atual, ou uma variedade de outras opções. Eles são separados por vírgula, e entre colchetes. Aqui está uma lista das Flags, com seus significados (esta informação é incluído no cheat sheet).
• C (acorrentado com a regra seguinte)
• CO=cookie (set cookie especificado)
• E=var:value (var conjunto variável de ambiente para o valor)
• F (forbidden [proibido] – envia um cabeçalho de 403 para o usuário)
• G (gone [se foi] – não existe mais)
• H=handler (conjunto manipulador)
• L (last – deixar de regras de processamento)
• N (next – continua regras de processamento)
• NC (case insensitive)
• NE (n ão escapar caracteres especiais na URL de saída)
• NS (ignorar esta regra se o pedido é um SUBPEDIDO)
• P (proxy – ou seja, o Apache deve pegar o conteúdo remoto especificado na seção de substituição e devolvê-lo)
• PT (passar – use quando URLs com os manipuladores de processamento adicional, por exemplo, mod_alias)
• R (temporária redirecionar para nova URL)
• R=301 (redirecionamento permanente para nova URL)
• QSA (query string de pedido de URL substituído)
• S=x (ignorar as regras ao lado x)
• T=mime-type (força especificada tipo mime)
Exceções e casos especiais
As condições podem ser testadas em algumas maneiras diferentes ,elas não precisam ser tratadas como padrões de expressões regulares, embora esta seja a maneira mais comum de serem usadas. Aqui estão as várias maneiras reescrever conditons pode ser processado:
•
Pattern (seqüência de teste é maior do padrão)
• =Pattern (seqüência de teste é igual ao padrão)
• -d (seqüência de teste é um diretório válido)
• -f (seqüência de teste é um arquivo válido)
• -s (seqüência de teste é um arquivo válido com tamanho maior que zer)
• -l (eqüência de teste é um link simbólico)
• -F (seqüência de teste é um arquivo válido e acessível (via SUBPEDIDO))
• -U (seqüência de teste é uma URL válida, e acessíveis (via SUBPEDIDO))
Variáveis de Servidor
Variáveis do servidor são uma seleção de itens que você pode testar quando estiver a escrever reescrever condições. Isto permite-lhe aplicar as regras com base em todos os tipos de parâmetros da requisição, incluindo os identificadores navegador, URL de referência ou uma infinidade de outras seqüências. As variáveis são do seguinte formato:
% {variable_name}
• HTTP Headers
o HTTP_USER_AGENT
o HTTP_REFERER
o HTTP_COOKIE
o HTTP_FORWARDED
o HTTP_HOST
o HTTP_PROXY_CONNECTION
o HTTP_ACCEPT
• Variáveis Connection
o REMOTE_ADDR
o REMOTE_HOST
o REMOTE_USER
o REMOTE_IDENT
o REQUEST_METHOD
o SCRIPT_FILENAME
o PATH_INFO
o QUERY_STRING
o AUTH_TYPE
• Server Variables
o DOCUMENT_ROOT
o SERVER_ADMIN
o SERVER_NAME
o SERVER_ADDR
o SERVER_PORT
o SERVER_PROTOCOL
o SERVER_SOFTWARE
• Data e Hora
o TIME_YEAR
o TIME_MON
o TIME_DAY
o TIME_HOUR
o TIME_MIN
o TIME_SEC
o TIME_WDAY
o TIME
• Itens Especiais
o API_VERSION
o THE_REQUEST
o REQUEST_URI
o REQUEST_FILENAME
o IS_SUBREQ
Exemplo de regras
Para redirecionar um domínio antigo para um novo domínio:
RewriteCond %{HTTP_HOST} velho_dominio\.com [NC] RewriteRule ^(.*)$ http://www.novo_dominio.com /$1 [L,R=301]
Para redirecionar todas as solicitações faltando “www” (sim www):
RewriteCond %{HTTP_HOST} ^dominio\.com [NC] RewriteRule ^(.*)$ http://www.dominio.com/$1 [L,R=301]
Para redirecionar todas as solicitações com “www” (sem www):
RewriteCond %{HTTP_HOST} ^www\.dominio\.com [NC] RewriteRule ^(.*)$ http:// dominio.com/$1 [L,R=301]
Redirecionar página antiga para a nova página:
RewriteRule ^old-url\.htm$ http://www.dominio.com/nova-url.htm [NC,R=301,L]
Para ter os usuários do site assim www.meusite.com.br/usuario, sem o default.asp?usr=NOME, só pelo /usuário:
RewriteEngine on
# Internamente adicionar extensões ao pedido
RewriteCond %{REQUEST_FILENAME}.asp -f
RewriteRule (.*) $1.asp
Fonte: vários sites e URL´s citadas no próprio post.
Nossa, quanta gambiarra, prefiro php….