Comment puis-je déterminer si une URL est redirigée?
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.
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";
}