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

时间:2010-05-27 05:56:38

标签: perl iis-6 module

我正在使用从IIS 6中的CGI scipt调用的Perl模块进行轰炸。 XP机器(IIS 5.1)上相同的文件夹结构非常棒。如果我在第9行删除了模块加载命令,它将打印“即将加载”和“确定”,但是当我尝试运行时

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"

1 个答案:

答案 0 :(得分:2)

问题在于

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

将其更改为Perl模块所在的完整路径:

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

或其他什么。

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

如果您不想在cgi脚本中使用绝对路径,请使用use lib模块在​​BEGIN块中使用FindBin进行调查。

缓解此类问题的一件事是CGI :: Carp模块及其“fatalsToBrowser”选项:

 use CGI::Carp 'fatalsToBrowser';

发现错误&amp;把它们扔到浏览器中。这仅用于调试。