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 プログラミングについて説明しています。これで、まともな基本を始めることができます。オンライン バージョンは初期のラフ ドラフトであることに注意してください。実際の本には、完全な Web アプリの例を含む第 19 章も含まれています。

于 2012-12-28T11:31:15.020 に答える
1

「500 内部サーバー エラー」は、Web サーバーが予期したとおりに何かが機能しなかったことを意味します。CGI が有効になっていない可能性があります。スクリプトが実行できない可能性があります。Web サーバーがアクセスを許可されていないディレクトリにある可能性があります。Web サーバーがスクリプトを正常に実行し、完全に機能したとしても、有効な HTTP ヘッダーのセットで出力を開始しなかった可能性さえあります。Web サーバーのエラー ログを調べて、何が気に入らなかったかを調べる必要があります。これは、Perl の問題である場合とそうでない場合があります。

ただし、他の誰もが言っているように、クエリ文字列を解析しようとしないで%ENVください。利用可能で、正しく動作することがすでにわかっている多くの優れたモジュールまたはフレームワークのいずれかを使用してください。 CGI.pmはそれらすべての祖父であり、小規模なプロジェクトではうまく機能しますが、DancerMojolicious、またはCatalystなどの適切な Web アプリケーション フレームワークを検討することをお勧めします(他にもたくさんありますが、これらは大きな 3 つです)。比較的単純なページとフォームがいくつかあるものを作成する予定です。

于 2012-12-28T12:59:56.070 に答える
1

問題はこの行でしょうか?

my (%hashref) = shift;

適切なハッシュを初期化していshiftますが、getdata(\%frmfields);. 代わりに、おそらくこれが必要です。

my $hashref = shift;
于 2012-12-28T04:12:49.463 に答える