如何从IIS6中的相对路径加载Perl模块?

问题描述:

我正在使用一个在IIS 6中被称为CGI scipt的Perl模块,该模块正在被轰炸。 XP机器上的相同文件夹结构(IIS 5.1)非常棒。如果我在第9行删除模块加载命令,它会打印“即将载入”和“确定”,但是当我尝试运行如何从IIS6中的相对路径加载Perl模块?

use Language::Guess; 

我收到

指定的CGI应用程序 由于没有返回完整的HTTP标头集合而导致行为不当。

在浏览器中。

的文件夹结构是 /cgi-bin/test.pl /PerlModules/Language/Guess.pm

我试图调整文件/文件夹的权限,并已审阅我的IIS配置一次又一次。它可以从IIS机器上的命令行运行良好,或者如果我将模块复制到\ Perl \ site \ lib中,但是我没有权限在此脚本指定的共享服务器上加载模块。我错过了一些简单的东西吗

这里是test.pl

use strict; 
use CGI ':standard'; 

print header("text/html"); 

use lib "..\\PerlModules\\"; 
print "about to load<br/>"; 
#bombs here 
use Language::Guess; 

print "ok" 
+0

编辑问题让它自己回答很奇怪。 – 2010-05-31 10:35:53

的问题是线

use lib "..\\PerlModules\\"; 

将其更改为完整路径的Perl模块,其中:

use lib "C:\\Perl\\PerlModules\\"; 

或什么。

原因是您的CGI脚本从同一目录中的命令行运行是正常的,但是当它由服务器从另一个目录运行绝对路径时,目录..\\PerlModules\\不再是正确的位置这些模块(因为现在......相对于服务器的目录而不是你的脚本)。当它尝试加载模块时,它无法找到它并输出错误消息。 Web服务器无法应对错误消息,因此您可以获得上述信息。

如果您不想在您的cgi脚本中使用绝对路径,请使用FindBin模块在BEGIN块内使用use lib进行调查。这减轻了这种问题

一件事是CGI :: Carp模块和它的“fatalsToBrowser”选项:

use CGI::Carp 'fatalsToBrowser'; 

捕获错误&抛出他们到浏览器。这仅用于调试。

+1

关于CGI :: Carp模块的大提示。 您的答案的最终代码是 使用FindBin; 使用lib“$ FindBin :: Bin /../ PerlModules”; – Laramie 2010-05-27 06:29:12

+0

这是在一个BEGIN {};是不是? – 2010-05-27 06:31:10