0

我收到错误消息“内部服务器错误。服务器遇到内部错误或配置错误,无法完成您的请求。”

我在 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 页面正确打开,但是当我提交表单时,出现内部服务器错误。

请帮忙。

4

4 回答 4

6

Web 服务器的错误日志说明了什么?

不管它说什么,您必须自己停止解析表单数据。有一些模块,特别是CGI.pm。使用它,您可以这样做:

use CGI;

my $CGI = CGI->new();

my $uid  = $CGI->param( 'uid'  );
my $pass = $CGI->param( 'pass' );

# rest of your script

更清洁,更安全。

于 2012-12-28T05:35:24.970 回答
3

我同意 Tore 的观点,你不能自己解析这个。您的代码有多个错误。你不允许多个参数值,你不允许 ; 备用分隔符,您不会使用 URL 中的查询字符串处理 POST,等等。

我不知道它会免费在线多久,但我的新书“Beginning Perl”的第 15 章涵盖了 Web 编程。这应该让你开始一些体面的基础知识。请注意,在线版本是早期的草稿。实际的书还包括第 19 章,其中有一个完整的 Web 应用程序示例。

于 2012-12-28T11:31:15.020 回答
1

可能是这条线有问题吗?

my (%hashref) = shift;

您正在初始化一个正确的哈希,但shift会给您一个哈希引用,因为您做了getdata(\%frmfields);. 你可能想要这个,而不是:

my $hashref = shift;
于 2012-12-28T04:12:49.463 回答
1

“500 Internal Server Error”只是意味着某些事情没有按照Web服务器的预期方式工作。也许您没有启用 CGI。也许脚本不可执行。也许它位于不允许 Web 服务器访问的目录中。甚至有可能 Web 服务器成功地运行了脚本并且它运行良好但没有使用一组有效的 HTTP 标头开始其输出。您需要查看 Web 服务器的错误日志以找出它不喜欢的内容,这可能是也可能不是 Perl 问题。

但是,就像其他人所说的那样,不要尝试解析查询字符串并%ENV自己卑躬屈膝。使用许多可用且已知可以正常工作的精细模块或框架之一。 CGI.pm是它们的鼻祖,适用于较小的项目,但我建议寻找合适的 Web 应用程序框架,例如DancerMojoliciousCatalyst(还有很多其他的,但这些是三巨头)如果您计划使用多个相对简单的页面和表单来构建任何东西。

于 2012-12-28T12:59:56.070 回答