Perl 如何确定URL是否重定向?

Perl 如何确定URL是否重定向?,perl,http,redirect,groovy,Perl,Http,Redirect,Groovy,如果我有一个URL(例如),我想确定我是否被重定向到另一个链接。我还想知道最终的URL(例如)。最后,我希望能够在Perl和Groovy中实现这一点。好吧,我对Perl或Groovy一无所知,因此我将从HTTP的角度为您提供另一个解决方案,您必须进行调整 通常,您发出一个HTTP请求,然后返回一些HTML文本和响应代码。成功的响应代码是200。300范围内的任何响应代码都是某种形式的重定向。在Perl中,您可以使用它。我想最简单的方法是添加响应\u重定向处理程序,使用add\u处理程序参考Jam

如果我有一个URL(例如),我想确定我是否被重定向到另一个链接。我还想知道最终的URL(例如)。最后,我希望能够在Perl和Groovy中实现这一点。

好吧,我对Perl或Groovy一无所知,因此我将从HTTP的角度为您提供另一个解决方案,您必须进行调整


通常,您发出一个HTTP请求,然后返回一些HTML文本和响应代码。成功的响应代码是200。300范围内的任何响应代码都是某种形式的重定向。

在Perl中,您可以使用它。我想最简单的方法是添加
响应\u重定向
处理程序,使用
add\u处理程序

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

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

一个快速且脏的groovy脚本来显示这些概念——注意,这是使用

为了检测重定向,必须使用
setFollowRedirects(false)
。否则,您将以200的
responseCode
返回重定向页面。缺点是你必须自己导航重定向

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

s/GET/HEAD/。使用google.com似乎没有更快,但使用microsoft.com试试吧。。。