Question

Si j’ai une adresse URL (par exemple, http://www.foo.com/ alink.pl?page=2 ), je souhaite déterminer si je suis redirigé vers un autre lien. J'aimerais également connaître l'URL finale (par exemple, http://www.foo.com/other_link. pl ). Enfin, je veux pouvoir le faire avec Perl et Groovy.

Était-ce utile?

La solution

En 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";
}

Autres conseils

Eh bien, je ne connais rien à Perl ni à groovy, je vais donc vous en donner un autre du point de vue HTTP, et vous devrez vous adapter.

Normalement, vous faites une requête HTTP et vous récupérez du texte HTML avec un code de réponse. Le code de réponse pour Success est 200. Tout code de réponse dans la plage 300 correspond à une forme de redirection.

En référence à la réponse de James - Exemple de session HTTP:

$ 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

En utilisant HEAD au lieu de GET, vous n’obtenez que l’en-tête. " 302 " signifie une redirection temporaire, " Emplacement: " est l'endroit où vous êtes redirigé.

Un rapide & amp; script groovy sale pour montrer les concepts - Notez, ceci utilise java.net.HttpURLConnection

Pour détecter la redirection, vous devez utiliser setFollowRedirects (false) . Sinon, vous vous retrouverez quand même sur la page redirigée avec un responseCode de 200. L'inconvénient est que vous devez alors naviguer vous-même vers la redirection.

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/"]

Je pense que cela fonctionnera pour les redirections 301.

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";
} 
scroll top