如果我有一个 URL(例如http://www.foo.com/alink.pl?page=2),我想确定我是否被重定向到另一个链接。我还想知道最终的 URL(例如http://www.foo.com/other_link.pl)。最后,我希望能够在 Perl 和 Groovy 中做到这一点。
anon
问问题
6577 次
6 回答
16
在 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";
}
于 2008-10-30T20:35:24.323 回答
8
好吧,我对 Perl 或 groovy 一无所知,所以我将从 HTTP 的角度再给你一个,你必须适应。
通常,您发出一个 HTTP 请求,然后您会返回一些 HTML 文本以及响应代码。Success 的响应代码是 200。300 范围内的任何响应代码都是某种形式的重定向。
于 2008-10-30T20:00:31.397 回答
4
参考詹姆斯的回答 - 示例 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”表示临时重定向,“Location:”是您被重定向到的位置。
于 2008-10-30T20:08:11.820 回答
3
一个快速而肮脏的 groovy 脚本来展示这些概念——注意,这是使用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/"]
于 2008-10-30T22:42:07.593 回答
2
在 Perl 中,您可以为此使用LWP::Useragent。我想最简单的方法是response_redirect
使用add_handler
.
于 2008-10-30T20:03:38.320 回答
1
我认为这适用于 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";
}
于 2011-06-12T22:27:59.850 回答