我需要创建一个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;
答案 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请求都无关紧要。