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 スクリプトがシェル内で実行されず、環境変数が見つからないということですか?

上記が当てはまる場合、他の手段を使用して BEGIN ブロック内で目的の変数を設定する必要がありますか?

ご協力いただきありがとうございます。

4

3 に答える 3

4

CGIプログラムの環境は、Webサーバーによって設定されます。HOMEは、Webサーバーの設定方法によって設定される場合と設定されない場合があります。設定されている場合は、ホームディレクトリではなく、Webサーバーが実行されているユーザーのホームディレクトリを指している可能性があります。

CGIプログラムから$ENV{HOME}の値を出力できます。さらに、%ENVハッシュ全体を出力して、実際に何が起こっているかを確認することもできます。

私の経験では、追加のライブラリへのフルパスをハードコーディングするか、外部でパスを設定する(たとえば、PERL5LIBを使用する)方がよいでしょう。プログラム内から設定する場合は、@ INCを直接変更するのではなく、「lib」プラグマを使用してください。

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

シェルと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 に答える
1

いくつかの問題と潜在的な回答のリストについては、Perl CGI スクリプトのトラブルシューティングを行うにはどうすればよいですか?から始めます。.

于 2010-12-16T06:34:12.657 に答える