如何使用Perl重定向?

时间:2014-08-16 22:50:02

标签: perl redirect cgi

我是Perl的新用户,当我输入正确的密码时,我正试图将用户重定向到我服务器上的另一个页面。我要重定向到的页面(hello.pl)与我的页面Perl脚本位于同一目录中;但是,当我尝试重定向时,我得到的是一条消息:

Status: 302 Found Location: hello.pl

但是浏览器实际上没有转到hell0.pl,这就是我想要的。我在网上看了Perl书,但看起来我做的一切都正常,有人可以告诉我为什么我的代码没有重定向吗?这是它的代码: 我省略了设置页面的代码并将用户输入存储在$ var中,即我在文件顶部执行了$ var = CGI-> new,我也使用CGI.pm作为库。

#!/usr/bin/perl -wT
use strict;

use CGI qw(:standard);

print header,
      start_html("Input Form"),
      start_form,
      "Please enter your username:",
      textfield(-name=>'username',
                      -maxlength=>20),p,
      "Please enter your password:",
      password_field(-name=>'password',
                      -maxlength=>20),p,
      submit,
      end_form,
      hr, "\n";

my $var = CGI->new;
my $username  = $var->param("username");
my $password  = $var->param("password");

my $open = "opensesamie";

  if ($password ne $open) {
          print "Sorry wrong password";
  } else {
          print $var->redirect('hello.pl');
          print $var->start_html,p,
          "Hello, $username",p,
          "The current time is ",scalar(localtime),
          $var->end_html;
  }

print end_html;

3 个答案:

答案 0 :(得分:2)

很抱歉延迟 - 我不得不设置一个有效的HTTP服务器来测试我的代码。

感谢您发布完整代码。正如我猜测的那样 - 你已经在程序顶部发了一条消息,然后将redirect输出添加到它,而你只需要 发送给客户端的重定向输出。 / p>

我认为这就是你所需要的。它会检查是否已发送usernamepassword参数。如果没有,那么必须显示表格以询问它们。如果是,那么如果密码错误,则必须发送错误消息,如果密码错误则必须发送重定向。

#!/usr/bin/perl

use strict;
use warnings;

use CGI qw(:standard);

my %names = map { $_ => 1 } param;
my $open  = 'opensesamie';

if ($names{username} and $names{password}) {

   my $username = param('username');
   my $password = param('password');

   if ($password eq $open) {
      print
         header,
         start_html,
         p('Sorry, wrong password'),
         end_html;
   }
   else {
      print redirect('hello.pl');
   }
}
else {

   print
      header,
      start_html('Input Form'),
      start_form,
         p('Please enter your username:'),
         textfield( -name => 'username', -maxlength => 20),
         p('Please enter your password:'),
         password_field( -name => 'password', -maxlength => 20),
         p,
         submit,
      end_form,
      hr,
      end_html;
}

答案 1 :(得分:1)

您正在输出两个标题。不要同时使用headerredirect

#!/usr/bin/perl -wT
use strict;

use CGI qw(:standard);

my $cgi = CGI->new;
my $username  = $cgi->param("username");
my $password  = $cgi->param("password");

if ($password eq "opensesamie") {
   print $cgi->redirect('hello.pl');
   exit();
}

print header;
print start_html("Please Login");
print p({-class => "error"}, "Incorrect password") if $password;
print ... print the form here ...;

答案 2 :(得分:0)

我认为你有这样的事情。

您是否在测试密码的print之前的某处启动了HTTP if语句?这会使print $cgi->redirect标题只是HTML文本的一部分。

use strict;
use warnings;

use CGI;

my %passwords;

my $cgi = CGI->new;

my $username = $cgi->param('username');
my $password = $cgi->param('password');

print
   $cgi->header,
   $cgi->start_html;

if ($password ne $open) {
   print 'Sorry wrong password';
}
else {
   print $var->redirect('hello.pl');
   print
      $var->start_html, p,
      "Hello, $username", p,
      "The current time is ", scalar(localtime),
      $var->end_html;
}      

您需要完全分开成功/失败,例如

use strict;
use warnings;

use CGI;

my %passwords;

my $cgi = CGI->new;

my $username = $cgi->param('username);
my $password = $cgi->param('password);

my $open = $passwords{$username};

if ($password ne $open) {
   print
      $cgi->header,
      $cgi->start_html;
      $cgi->p('Sorry wrong password'),
      $cgi->end_html;
}
else {
   print $var->redirect('hello.pl');
}