如何确定URL是否重定向?

时间:2008-10-30 19:56:37

标签: perl http redirect groovy

如果我有一个URL(例如http://www.foo.com/alink.pl?page=2),我想确定我是否被重定向到另一个链接。我也想知道最终的网址(例如http://www.foo.com/other_link.pl)。最后,我希望能够在Perl和Groovy中执行此操作。

6 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:8)

好吧,我对Perl或groovy都一无所知,所以我会从HTTP的角度给你另一个,你必须适应。

通常,您发出HTTP请求,然后返回一些HTML文本以及响应代码。 Success的响应代码是200.300范围内的任何响应代码都是某种形式的重定向。

答案 2 :(得分:4)

参考James的回答 - 示例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”表示临时重定向,“位置:”是您重定向到的位置。

答案 3 :(得分: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/"]

答案 4 :(得分:2)

在Perl中,您可以使用LWP::Useragent。我想最简单的方法是使用response_redirect添加add_handler处理程序。

答案 5 :(得分: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";
}