0

IF 条件に基づいて http 404 ステータス コードを送信しようとしています。しかし、クライアント側で http 500 エラーが表示されます。apach2 エラー ログに、不正な形式のヘッダーが表示されます。自分のコードを何度も見ても、何が問題なのかわかりませんでした! クライアントに 404 メッセージを送信する方法を教えてください。

以下は私のperlコードです:

#!/usr/bin/perl

use CGI qw(:standard);
use strict;
use warnings;
use Carp;
use File::Copy qw( copy );
use File::Spec::Functions qw( catfile );
use POSIX qw(strftime);
use Time::Local;
use HTTP::Status qw(:constants :is status_message);
use Digest::MD5 qw(md5 md5_hex md5_base64);
use File::Basename;
use URI;



my $extfile = '/home/suresh/clientrequest.txt';
open(FH, ">>$extfile") or die "Cannot open file";
my $query = CGI->new;
my $stcode = status_message(200);
my $uri =$ENV{'REQUEST_URI'};
my $rdate =strftime("%a, %d %b %Y %H:%M:%S %Z", localtime());
print FH "Got Following Headers:\n";
print FH $ENV{'REQUEST_URI'}, "\n";
my $dir  = '/home/suresh/Assets/';
my $nffFile = fileparse ("$uri", qr/\.[^.]*/);
my $fullFname = $nffFile . ".nff";
my $path = catfile($dir, $fullFname);
print FH "fullname:", $fullFname, "\n";

#Search requested asset files
opendir(DIR, $dir);
my @files = readdir(DIR);
if (grep($_=~/$fullFname/,@files)){
print FH "Found the file: ", $fullFname, "\n";
open my $fh, '<:raw', $path;
print "$ENV{SERVER_PROTOCOL} 200 $stcode";
print $query->header(
        -'Date'=> $rdate,
        -'Content-Type'=>'application/octet-stream',
        -'Connection'=>'Keep-Alive',
        -'attachment'=>$path,
    );
binmode STDOUT, ':raw';

 copy $fh => \*STDOUT;
    close $fh
        or die "Cannot close '$path': $!";

}else {
        $stcode = status_message(404);
        print "$ENV{'SERVER_PROTOCOL'} 404 $stcode\n";
        print $query->header(
        -'Server'=>$ENV{'SERVER_SOFTWARE'},
        -'Content-type'=>'text/plain',
        );
        }
closedir(DIR);
4

1 に答える 1

5

何よりも前に、最初にヘッダーを印刷する必要があります。そうしないと、ブラウザーは、送信されたものを処理する方法を認識できません。これの代わりに:

print "$ENV{SERVER_PROTOCOL} 200 $stcode";
print $query->header( ... );

これを行う:

print $query->header( ... );
print "$ENV{SERVER_PROTOCOL} 200 $stcode";

また、CGI.pm を使用して HTTP ステータス コードを指定することもできます。

print $query->header( -status => '404 Not Found' );

CGI アプリケーションをデバッグするためのちょっとしたヒント: change

use Carp;

use CGI::Carp qw(fatalsToBrowser);

これにより、致命的なエラーがブラウザーに直接表示されるため、Web サーバーのログを探し回る必要がなくなります。ただし、アプリケーションの内部動作が攻撃者に明らかになる可能性があるため、実稼働コードでオプションを有効にしたままにしないでください。fatalsToBrowser

于 2013-10-01T14:47:02.370 に答える