6

IIS は常に不必要にクラッシュするため、IIS の代わりに apache をセットアップしようとしています。共通のチェックアウトを編集する代わりに、ソースの独自のチェックアウトができると便利です。

IISでは、各ファイルの先頭で次のようにする必要があります。

use CGI;
my $input = new CGI();
print "HTTP/1.0 200 OK";
print $input->header();

一方、apacheでは 200 OK 行を外さなければなりません。以下は両方で機能します。

use CGI;
my $input = new CGI();
print $input->header('text/html','200 OK');

誰でも理由を説明できますか?そして、CGIモジュールがこの種の詳細を自動的に把握するはずだったという印象を受けました...

ありがとう!

更新: brian の言うとおりです。nph は IIS の問題を修正しますが、Apache の問題はまだ解決されていません。コード全体に条件を付ける価値はないと思うので、nph の有無にかかわらず機能する最後の方法に固執します。

4

3 に答える 3

14

HTTP と CGI は別物です。Perl CGI モジュールは、それが行うことを「HTTP ヘッダー」と呼びますが、これは実際にはサーバーがクライアントに戻る前に修正する CGI ヘッダーにすぎません。それらは非常によく似ているため、人々は混乱し、CGI.pm ドキュメントはそれらを間違ったものと呼んで助けにならないのです。

Apache は、CGI ヘッダーを修正して HTTP ヘッダーにします。これには、HTTP ステータス行やその他の必要なものを追加することも含まれます。

Web サーバーがヘッダーを修正していない場合は、ヘッダー全体の責任を負う "解析されていないヘッダー" を期待している可能性があります。CGI.pm でこれを行うには、-nphヘッダーへの呼び出しにオプションを追加する必要があり、 や などのヘッダーを含む完全なヘッダーを自分で作成する必要がありExpiresますLast-Modified標準 HTTP ヘッダーの作成のドキュメントを参照してください。NPH を有効にするには、次の 3 つの方法があります。

use CGI qw(-nph)

CGI::nph(1)

print header( -nph => 1, ...)

古いバージョンの IIS を使用していますか? CGI.pm は、IIS に対して自動的に NPH 機能をオンにしていましたが、現在は CGI.pm のソースでその行がコメント化されています。

# This no longer seems to be necessary
# Turn on NPH scripts by default when running under IIS server!
# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
于 2008-11-21T06:50:59.257 に答える
0

perl でも同様の問題がありました (これは DOS/Unix/Mac の改行の問題でした!)

binmode(STDOUT);
my $CRLF = "\r\n"; # "\015\012"; # ^M: \x0D  ^L: \x0A
print "HTTP/1.0 200 OK",$CRLF if ($0 =~ m/nph-/o);
print "Content-Type: text/plain".$CRLF;
print $CRLF; print "OK !\n";
于 2016-08-13T12:17:59.490 に答える
0

ISAPI を介して IIS 7 で実行されている ActivePerl 5.14 で、この問題がまだ発生しています。ActivePerl 5.10のFAQは、問題が修正されたと主張しています (5.14 の FAQ は問題に対処していません)。

$ENV{PerlXS} eq 'PerlIS'前述のFAQに従ってISAPIを検出し、NPHキーをオンにするために使用するとうまくいくようです。CGI.pm をハックして、古い IIS ハンドラの下に以下の最後の 2 行を追加しました。

# This no longer seems to be necessary
# Turn on NPH scripts by default when running under IIS server!
# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
# Turn on NPH scripts by default when running under IIS server via ISAPI!
$NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{PERLXS} eq 'PerlIS';
于 2012-06-21T12:34:34.327 に答える