6

我正在尝试设置 apache 而不是 IIS,因为IIS 总是不必要地崩溃,并且能够让我自己检出源代码而不是我们所有人都编辑通用检出会很好。

在 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 模块应该自动找出这些细节......

谢谢!

更新:布赖恩是对的,nph 解决了 IIS 的问题,但它仍然是 Apache 的问题。我认为在代码中使用条件是不值得的,所以我将坚持使用最后一种方法,无论是否使用 nph。

4

3 回答 3

14

HTTP 和 CGI​​ 是不同的东西。Perl CGI 模块将其功能称为“HTTP 标头”,但实际上它只是一个 CGI 标头,供服务器在返回客户端之前进行修复。它们看起来很相似,这就是为什么人们会感到困惑以及为什么 CGI.pm 文档通过称它们是错误的东西而无济于事的原因。

Apache 修复了 CGI 标头以使其成为 HTTP 标头,包括添加 HTTP 状态行和它可能需要的任何其他内容。

如果您的网络服务器没有为您修复标头,那么它可能期望一个“未解析的标头”,您负责整个标头。要在 CGI.pm 中执行此操作,您必须将-nph选项添加到对标头的调用中,并且您必须自己制作完整的标头,包括标头ExpiresLast-Modified. 请参阅创建标准 HTTP 标头下的文档。您可以通过三种方式打开 NPH:

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

在通过 ISAPI 在 IIS 7 下运行的 ActivePerl 5.14 时,我仍然遇到这个问题。ActivePerl 5.10 FAQ声称问题已修复(5.14 FAQ 甚至没有解决该问题),但它似乎没有解决,并且设置他们建议使用的注册表项在此环境中无效。

根据上述常见问题解答使用$ENV{PerlXS} eq 'PerlIS'检测 ISAPI 并打开 NPH 密钥似乎有效。我破解了我的 CGI.pm,在旧的 IIS 处理程序下添加了下面的最后两行:

# 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 回答
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 回答