我有一个类似于以下内容的cgi脚本:
BEGIN {
unshift (@INC, "$ENV{'HOME'}/www/cgi-bin/SiteSpecific");
}
print "Content-type: text/html\n\n";
use SiteObject;
my $siteObjInst = SiteObject->instance();
print $siteObjInst->{HideFields};
这可以从命令提示符运行良好,但在从浏览器作为CGI脚本运行时失败。由于脚本无法找到模块,因此可能未设置$ ENV {'HOME'}。
是不是CGI脚本不在shell中运行而且找不到环境变量?
如果以上情况属实,我是否需要使用其他方法在BEGIN块中设置所需的变量?
感谢您的帮助。
答案 0 :(得分:4)
CGI程序将由Web服务器设置其环境。可以设置或不设置HOME,具体取决于Web服务器的设置方式,如果设置了它,它可能会指向运行Web服务器的用户的主目录,而不是您的主目录。
您可以从CGI程序打印$ ENV {HOME}的值,甚至更好,打印整个%ENV哈希以查看实际发生的情况。
根据我的经验,最好是硬编码额外库的完整路径或在外部设置路径(例如使用PERL5LIB)。如果您是从程序内部设置它,请使用“lib”编译指示而不是直接修改@INC:
use lib '/home/user/www/cgi-bin/siteSpecific';
答案 1 :(得分:1)
您绝对无法保证您的shell和运行Web服务器的ID具有$ENV{HOME}
的相同变量。暂时忘掉所有代码,试试这个:
print "Content-type: text/html\n\n";
print q[<html><head><title>A Page</title></head>]
. qq[<body><h1>\$HOME=$ENV{HOME}</h1></body></html>]
;
甚至这个:
use strict;
use warnings;
use CGI;
my $q = CGI->new;
print $q->header
, $q->start_html( 'A Page' )
, $q->start_table
, $q->Tr( $q->th( 'Name' ), $q->th( 'Value' ))
, ( map { $q->Tr( $q->td( $_ ), $q->td( $ENV{$_} )) } sort keys %ENV )
, $q->end_table
, $q->end_html
;
答案 2 :(得分:1)
有关一些问题和潜在答案的列表,我将从How can I troubleshoot my Perl CGI script?开始。