我正在使用从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"
答案 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;把它们扔到浏览器中。这仅用于调试。