sexta-feira, 4 de abril de 2008

Reescrevendo URL a partir de parametros de outra URL

O processo consiste em reescrever a URL a partir do valor contido em uma variável de parâmetro da URL de origem
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: