我正在尝试设置apache而不是IIS,因为
IIS needlessly crashes一直都是,并且能够自己检查源代码而不是我们所有人编辑一个常见的结帐都会很好.
在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.
解决方法
HTTP和CGI是不同的东西. Perl CGI模块调用它所做的“HTTP头”,但它实际上只是服务器在返回客户端之前修复的CGI头.它们看起来很相似,这就是为什么人们会感到困惑,以及为什么CGI.pm文档无法通过将它们称为错误的东西来帮助它们.
Apache修复了CGI标头,使其成为HTTP标头,包括添加HTTP状态行以及可能需要的任何其他内容.
如果您的网络服务器没有为您修复标头,那么可能需要一个“未解析的标头”,您负责整个标头.要在CGI.pm中执行此操作,您必须将-nph选项添加到对标头的调用中,并且您必须自己创建完整标头,包括Expires和Last-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/;