1

我有一个类似于以下内容的 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 块中设置所需的变量?

谢谢你的帮助。

4

3 回答 3

4

CGI 程序的环境由 Web 服务器设置。HOME 可能会或不设置取决于您的 Web 服务器的设置方式,如果已设置,它可能会指向运行 Web 服务器的用户的主目录,而不是您的主目录。

您可以从 CGI 程序打印 $ENV{HOME} 的值,或者更好的是,打印整个 %ENV 哈希以查看实际情况。

根据我的经验,最好硬编码额外库的完整路径或在外部设置路径(例如使用 PERL5LIB)。如果您从程序内部设置它,请使用“lib”编译指示,而不是直接修改 @INC:

use lib '/home/user/www/cgi-bin/siteSpecific';
于 2010-12-16T06:28:32.803 回答
1

对于一些问题和潜在答案的列表,我将从如何对我的 Perl CGI 脚本进行故障排除开始?.

于 2010-12-16T06:34:12.657 回答
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
    ;
于 2010-12-16T06:28:12.467 回答