2008-11-21 68 views
6

我试图设置Apache而不是IIS,因为IIS needlessly crashes一直都是,并且能够自己签出源代码而不是我们所有人编辑通用签出的代码会很好。为什么我需要为IIS显式输出HTTP头,而不是Apache?

在IIS中,我们必须做这样的事情在每个文件的开头:

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

而与阿帕奇我们必须离开关闭200 OK线。以下两种方式适用:

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

任何人都可以解释为什么?我的印象是,CGI模块应该自动计算出这些细节...

谢谢!

更新:布莱恩是正确的,nph修复了IIS的问题,但它仍然为Apache破碎。我认为在代码中使用条件并不值得,所以我会坚持使用最后一种方法,该方法可以与nph协同工作。

+0

也许IIS会让你感到困惑,因为你的输出直接来自输入变量? ;-) – innaM 2008-11-21 09:57:24

回答

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/; 
0

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

使用$ENV{PerlXS} eq 'PerlIS'来检测ISAPI并打开上述FAQ中的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'; 
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"; 
相关问题