Pergunta

Se eu tiver um URL (por exemplo. http://www.foo.com/ alink.pl?page=2 ), eu quero determinar se estou sendo redirecionado para outro link. Eu também gostaria de saber o URL final (eg. http://www.foo.com/other_link. pl ). Finalmente, eu quero ser capaz de fazer isso em Perl e Groovy.

Foi útil?

Solução

Em Perl:

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;

my $request  = HTTP::Request->new( GET => 'http://google.com/' );
my $response = $ua->request($request);
if ( $response->is_success and $response->previous ) {
    print $request->url, ' redirected to ', $response->request->uri, "\n";
}

Outras dicas

Bem, eu não sei nada sobre qualquer Perl ou groovy, então eu vou dar-lhe uma outra, de um ponto de vista HTTP, e você terá de se adaptar.

Normalmente, você faz uma solicitação HTTP, e você recebe de volta algum texto HTML juntamente com um código de resposta. O código de resposta para o sucesso é 200. Qualquer código de resposta na gama 300 é alguma forma de um redirecionamento.

Referindo-se a resposta de James - sessão HTTP de exemplo:

$ telnet www.google.com 80
HEAD / HTTP/1.1
HOST: www.google.com


HTTP/1.1 302 Found
Location: http://www.google.it/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: ##############################
Date: Thu, 30 Oct 2008 20:03:36 GMT
Server: ####
Content-Length: 218

Usando cabeça em vez de GET você recebe apenas o cabeçalho. "302" significa um redirecionamento temporário, "Localização:". É onde você será redirecionado para

Um script Groovy rápida e suja para mostrar os conceitos - Nota, isso é usando java.net.HttpURLConnection

A fim de detectar o redirecionamento, você tem que usar setFollowRedirects(false). Caso contrário, você acaba na página redirecionada de qualquer maneira com um responseCode de 200. A desvantagem é que você então tem que navegar o redirecionamento si mesmo.

URL url = new URL ('http://google.com')
HttpURLConnection conn = url.openConnection()
conn.followRedirects = false
conn.requestMethod = 'HEAD'
println conn.responseCode
// Not ideal - should check response code too
if (conn.headerFields.'Location') {
  println conn.headerFields.'Location'
}

301
["http://www.google.com/"]

Em Perl você pode usar LWP :: Useragent por isso. Eu acho que a maneira mais fácil é para adicionar um manipulador response_redirect usando add_handler.

Eu acho que isso vai funcionar para 301 redirecionamentos.

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;

my $request  = HTTP::Request->new( GET => 'http://google.com/' );
my $response = $ua->request($request);
if ( $response->is_redirect  ) {
    print $request->url . " redirected to location " .  $response->header('Location') .  "\n";
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top