我收到错误“内部服务器错误。服务器遇到内部错误或配置错误,无法完成您的请求。”
我在html中提交表单并获取其值。
HTML代码(index.cgi)
#!c:/perl/bin/perl.exe
print "Content-type: text/html; charset=iso-8859-1\n\n";
print "<html>";
print "<body>";
print "<form name = 'login' method = 'get' action = '/cgi-bin/login.pl'> <input type = 'text' name = 'uid'><br /><input type = 'text' name = 'pass'><br /><input type = 'submit'>";
print "</body>";
print "</html>";
用于获取数据的Perl代码(login.pl)
#!c:/perl/bin/perl.exe
use CGI::Carp qw(fatalsToBrowser);
my(%frmfields);
getdata(\%frmfields);
sub getdata {
my ($buffer) = "";
if (($ENV{'REQUEST_METHOD'} eq 'GET')) {
my (%hashref) = shift;
$buffer = $ENV{'QUERY_STRING'};
foreach (split(/&/,$buffer)) {
my ($key, $value) = split(/=/, $_);
$key = decodeURL($key);
$value= decodeURL($value);
$hashref{$key} = $value;
}
}
else{
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'})
}
}
sub decodeURL{
$_=shift;
tr/+/ /;
s/%(..)/pack('c', hex($1))/eg;
return($_);
}
HTML页面正确打开但是当我提交表单时,我收到内部服务器错误。
请帮忙。
答案 0 :(得分:6)
Web服务器的错误日志是什么意思?
独立于它所说的内容,必须自行停止解析表单数据。有模块,特别是CGI.pm。使用它,您可以改为:
use CGI;
my $CGI = CGI->new();
my $uid = $CGI->param( 'uid' );
my $pass = $CGI->param( 'pass' );
# rest of your script
更干净,更安全。
答案 1 :(得分:3)
我同意Tore你不能自己解析这个问题。您的代码有多个错误。你不允许多个参数值,你不允许;备用分隔符,您不会在URL中使用查询字符串处理POST,依此类推。
我不知道免费在线多长时间,但chapter 15 of my new "Beginning Perl" book covers Web programming。这应该让你开始一些体面的基础知识。请注意,在线版本是早期的粗略草稿。实际的书还包括第19章,它有一个完整的Web应用程序示例。
答案 2 :(得分:1)
可能是这条线是问题吗?
my (%hashref) = shift;
您正在初始化正确的哈希值,但shift
会为您提供哈希引用,因为您执行了getdata(\%frmfields);
。你可能想要这个,而不是:
my $hashref = shift;
答案 3 :(得分:1)
“500内部服务器错误”只是意味着某些东西不像Web服务器所期望的那样工作。也许你没有启用CGI。也许脚本不可执行。也许它位于不允许Web服务器访问的目录中。甚至可能是Web服务器成功运行脚本并且完美地,但是没有使用有效的HTTP标头集启动其输出。您需要查看Web服务器的错误日志以找出它不喜欢的内容,这可能是也可能不是Perl问题。
就像其他人所说的那样,不要尝试解析查询字符串并尽可能地自我调整。{1}}。使用众多可用且已知可正常工作的精细模块或框架之一。 CGI.pm是他们所有人的祖父,并且适用于较小的项目,但我建议您查看适当的Web应用程序框架,例如Dancer,Mojolicious或Catalyst (如果你计划用一些相对简单的页面和表格构建任何东西,那么还有很多其他的,但那些是三巨头)。