perl cgi脚本,接受参数url进行重定向

时间:2015-05-26 11:08:45

标签: perl redirect cgi

我需要创建一个Perl CGI脚本,它接受一个参数作为输入。该参数将是一个完全限定的URL,脚本会将浏览器重定向到已作为参数传递的URL。该方法是GET而不是POST。

浏览器地址栏将接受带有URL参数的完整脚本,如下所示:http://webserver/cgi-bin/myscript.pl?URL=http://www.google.com

我是Perl的新手,我可以弄清楚如何使用POST,但不是GET。任何帮助将不胜感激。

我偷了这个代码,但它没有做GET,我认为我使用的是一个不好的例子或者不适用于我需要做的事情:

更新:这是我的解决方案

#!/usr/local/bin/perl
use strict;
use warnings;


use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
use URI::Escape;
use strictures;
use CGI;
use URI;

my $q = new CGI ;
my $url = "httpcandy";

# Process an HTTP request
#my @values  = $q->multi_param('form_field');
my $value   = $q->param('param_name');


print "Content-type: text/html\n\n";
#print "<pre>\n";
#
#foreach my $key (sort keys(%ENV)) {
#  print "$key = $ENV{$key}<br/>";
#}
#print "</pre>\n";



my $requested = URI->new( CGI::url() );
$requested->query( $ENV{QUERY_STRING} || $ENV{REDIRECT_QUERY_STRING} )
    if url_param();


#print header(),
#    start_html(),
#    h1("requested:"),
#    blockquote($requested),
#    h1("url:"),
#    blockquote($value),
#    h1("nothing else"),
#
#    end_html();
#    
if ($value =~ /http/)
{
   print "<META HTTP-EQUIV=refresh CONTENT=\"1;$value\">\n";
}
else
{
   print "<META HTTP-EQUIV=refresh CONTENT=\"1;URL=http://$value\">\n";
};

exit;

1 个答案:

答案 0 :(得分:1)

您的解决方案似乎过度设计。我认为这可以满足您的所有需求。

#!/bin/env perl

use strict;
use warnings;
use CGI ':cgi'; # Only the CGI functions

my $url = param('URL');

if ($url !~ /^http/) {
  $url = "http://$url";
}

print redirect($url);

特别是,您在HTML页面中使用META HTTP-EQUIV的解决方案似乎很奇怪。 HTTP-EQUIV适用于无法更改Web服务器标头的情况。但是当我们编写CGI程序时,我们可以返回我们警告的任何标题。因此,使用redirect()函数返回302响应似乎是最明显的解决方案。

注意:如果使用param()函数获取输入,则无论是GET还是POST请求都无关紧要。