我是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;
答案 0 :(得分:2)
很抱歉延迟 - 我不得不设置一个有效的HTTP服务器来测试我的代码。
感谢您发布完整代码。正如我猜测的那样 - 你已经在程序顶部发了一条消息,然后将redirect
输出添加到它,而你只需要 发送给客户端的重定向输出。 / p>
我认为这就是你所需要的。它会检查是否已发送username
和password
参数。如果没有,那么必须显示表格以询问它们。如果是,那么如果密码错误,则必须发送错误消息,如果密码错误则必须发送重定向。
#!/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)
您正在输出两个标题。不要同时使用header
和redirect
。
#!/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');
}