Как я могу определить, перенаправляет ли URL-адрес?
Вопрос
Если у меня есть URL (например, http://www.foo.com/ alink.pl?page=2 ), я хочу определить, перенаправлен ли я на другую ссылку. Я также хотел бы знать окончательный URL-адрес (например, http://www.foo.com/other_link. пл ). Наконец, я хочу сделать это в Perl и Groovy.
Решение
В 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";
}
Другие советы
Ну, я ничего не знаю ни о Perl, ни о Groovy, поэтому я дам вам еще одну с точки зрения HTTP, и вам придется адаптироваться.
Обычно вы делаете HTTP-запрос и возвращаете некоторый HTML-текст вместе с кодом ответа. Код ответа для Success - 200. Любой код ответа в диапазоне 300 является некоторой формой перенаправления.
Ссылаясь на ответ Джеймса - пример 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, вы получаете только заголовок. & Quot; 302 & Quot; означает временное перенаправление, "Местоположение:" куда вы перенаправлены.
Быстрый & amp; грязный скриптовый скрипт для демонстрации концепций. Обратите внимание, что для этого используется 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/"]
Я думаю, что это будет работать для 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";
}