Как определить, перенаправляется ли URL?

Если у меня есть URL (например http://www.foo.com/alink.pl?page=2), я хочу определить, перенаправляется ли я на другую ссылку. Я также хотел бы узнать конечный URL (например, http://www.foo.com/other_link.pl). Наконец, я хочу иметь возможность сделать это в Perl и Groovy.

Ответ 1

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

Ответ 2

Ну, я ничего не знаю о Perl или groovy, поэтому я дам вам другую с точки зрения HTTP, и вам придется адаптироваться.

Обычно вы делаете HTTP-запрос, и вы возвращаете некоторый текст HTML вместе с кодом ответа. Код ответа для успеха - 200. Любой код ответа в диапазоне 300 - это некоторая форма перенаправления.

Ответ 3

Ссылаясь на ответ Джеймса - пример 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

Используя HEAD вместо GET, вы получаете только заголовок. "302" означает временное перенаправление, "Местоположение:" - это то, к которому вы перенаправлены.

Ответ 4

Быстрый и грязный groovy script, чтобы показать концепции. Примечание. Это используется java.net.HttpURLConnection

Чтобы обнаружить перенаправление, вы должны использовать setFollowRedirects(false). В противном случае вы попадаете на перенаправленную страницу в любом случае с responseCode из 200. Недостатком является то, что вам придется переадресовать перенаправление самостоятельно.

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

Ответ 5

В Perl вы можете использовать LWP:: Useragent. Я думаю, самый простой способ - добавить обработчик response_redirect, используя add_handler.

Ответ 6

Я думаю, что это будет работать для 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";
}