Exemplo:
de
http://localhost/template.aspx&palavra=ipod&acao=busca&menu=compareprecos&imageField.x=0&imageField.y=0
para
http://localhost/search?q=ipod&x=0&y=0
Onde :
localhost - é o servidor
/template.aspx - é a URL
&palavra=ipod&acao=busca&menu=compareprecos&imageField.x=0&imageField.y=0 - é parâmetro da URL
palavra=ipod - é a variável 'palavra' com seu valor 'ipod'
search - é a nova URL
?q=ipod&x=0&y=0 - é o novo parâmetro d URL contendo um valor de uma variável do parâmetro antigo
E o que desejamos é apenas este valor de uma unica variável o resto seria todo descartado, a principio o rewrite não faz isto, pois os mecanismos contido nele trata apenas do absoluto que é passado e não de seus parâmetros, apesar de conter uma variável que contem estes parâmetros (%{QUERY_STRING}), e isto é parte do que utilizaremos junto com um mecanismo que passa para um programa externo, o RewriteMap
- O parametro RewriteMap é utilizado da seguinte maneira:
RewriteMap MapName MapType:MapSource
Onde :
MapName é o nome do mapeamento em si
MapType é o tipo do mapeamento
MapSource é onde esta este mapeamento
Bom utilizarei como nome do mapeamento nome_mapeamento, e neste caso como terei que tratar todo o parâmetro, utilizarei um programa externo para isto, usarei o perl para isto e utilizarei como tipo de mapeamento o paremetro prg e logo a seguir o caminho completo de execução do programa, ficando assim
RewriteMap nome_mapeamento prg:/var/www/scripts/remapemento.pl
Observe que existirá o programa /var/www/scripts/remapemento.pl , logo abaixo descrevo ele.
E para chama-lo seria:
${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }
Onde:
LookupKey é o parametro passado para o programa externo, normalmente alguma variavel do Rewrite
DefaultValue é um valor padrão caso não exista um ou valor na variavel passada
Assim ficamos com a seguinte regra no Rewrite :
RewriteEngine on
RewriteMap nome_mapeamento prg:/var/www/scripts/remapemento.pl
RewriteRule ^/(template.aspx)$ /${nome_mapeamento:$1\&%{QUERY_STRING}} [R]
Para exemplificar, o programa em perl verifica se existe as variaveis com seus valores ( acao=busca e menu=compareprecos ) coletando o valor contido na variavel palavra , havendo a condição descrita reescreva para que na nova URL contenha apenas o valor coletado :
Exemplo
Entrada : template.aspx&palavra=ipod&acao=busca&menu=compareprecos&imageField.x=0&imageField.y=0
Saida : search?q=ipod&x=0&y=0
Abaixo o programa :
#!/usr/bin/perl
$| = 1;
debug=0;
# Cria o loop que ficará aguardando o repasse do rewrite
while (
open (RET,">>/tmp/retorno.log") if ( $debug );;
$str = $_;
$busca = "";
$acao = 0;
$menu = 0;
print RET "$str\n" if ( $debug );
# Separa os parametros em variavel=valor
@array = split(/&/,$str);
for ( @array ) {
# Separa a variavel de seu valor
@parte = split (/\=/);
# Verifica se o nome da variavel é palavra se for salva seu valor
if ( @parte[0] eq "palavra" ) {
$busca = @parte[1] ;
print RET "\n---\nbusca=$busca\n---\n" if ( $debug );
}
# Verifica primeira condição para reescrever varivel acao com valor busca
if ( $_ eq "acao=busca" ) {
$acao = 1;
}
# Verifica segunda condição para reescrever varivel menu com valor compareprecos
if ( $_ eq "menu=compareprecos" ) {
$menu = 1;
}
print RET "$_\n" if ( $debug );
}
# Satisfazendo as condicoes reescreve a URL caso contrario devolve ela sem alteraçao
if (( $acao == 1) && ( $menu == 1 )) {
print RET "search?q=$busca&x=0&y=0\n" if ( $debug );
print "search?q=$busca&x=0&y=0\n" ;
} else {
int RET $str if ( $debug );
print $str;
}
close (RET);
}
Nenhum comentário:
Postar um comentário