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

2024-04-13

我正在尝试设置 apache 而不是 IIS,因为IIS 不必要地崩溃 https://stackoverflow.com/questions/188896/why-does-iis-crash-when-i-print-to-stderr-in-perl一直以来,如果能够拥有我自己的源代码检查而不是我们所有人都编辑公共检查,那就太好了。

在IIS中我们must在每个文件的开头执行类似的操作:

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

而对于 apache 我们must留下 200 OK 行。以下内容适用于两者:

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

谁能解释为什么?我的印象是 CGI 模块应该自动找出这些细节......

Thanks!

Update:brian 是对的,nph 修复了 IIS 的问题,但对于 Apache 来说仍然有问题。我认为在整个代码中都有条件是不值得的,所以我将坚持使用最后一个方法,无论有没有 nph,该方法都适用。


HTTP 和 CGI​​ 是不同的东西。 Perl CGI 模块将其所做的称为“HTTP 标头”,但它实际上只是服务器在返回客户端之前修复的 CGI 标头。它们看起来非常相似,这就是为什么人们会感到困惑,也是为什么 CGI.pm 文档通过错误地称呼它们而无济于事。

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

如果您的网络服务器没有为您修复标头,则它可能需要一个“未解析的标头”,您需要对整个标头负责。要在 CGI.pm 中执行此操作,您必须添加-nph选项来调用标头,并且您必须自己制作完整的标头,包括诸如Expires and Last-Modified。请参阅下面的文档创建标准 HTTP 标头 http://search.cpan.org/~lds/CGI.pm-3.42/CGI.pm#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/;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我需要显式输出 IIS 的 HTTP 标头而不是 Apache? 的相关文章

随机推荐