为什么我需要显式输出IIS的HTTP头而不是Apache?

时间:2008-11-21 06:38:36

标签: perl apache http iis cgi

我正在尝试设置apache而不是IIS,因为IIS needlessly crashes始终是{{3}},并且能够自己检查源代码而不是我们所有人编辑常见的结帐都会很好。< / p>

在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。

3 个答案:

答案 0 :(得分:14)

HTTP和CGI是不同的东西。 Perl CGI模块调用它所做的“HTTP头”,但它实际上只是服务器在返回客户端之前修复的CGI头。它们看起来很相似,这就是为什么人们会感到困惑,以及为什么CGI.pm文档无法帮助他们做错事。

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

如果您的网络服务器没有为您修复标头,则可能需要一个“未解析的标头”,您负责整个标头。要在CGI.pm中执行此操作,您必须在标题调用中添加-nph选项,并且必须自行制作完整标题,包括ExpiresLast-Modified等标题。请参阅Creating a Standard HTTP Header下的文档。您可以通过三种方式打开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/;

答案 1 :(得分:0)

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

使用$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';

答案 2 :(得分: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";