- ベストアンサー
コマンドラインで通っているパスがブラウザからだと通っていない
以下のようなcgiを組みました。 #! /usr/bin/perl -w use Calendar::Simple; use CGI::Carp qw(fatalsToBrowser); use Data::Dumper; use lib "/home/makoji/makoji00001/myperl/lib"; my @curr=calendar; print Dumper(@curr); レンタルサーバー上のこのCGIをSSHで perl calendar.cgi とやるときちんと作動します。 しかしながらブラウザから作動すると500 Internal Sever Errorが出ます。 エラーログを見ると、以下のようになっています。 [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Can't locate Calendar/Simple.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/i686-linux /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/i686-linux /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl .) at /home/makoji/makoji00001/www/calendar.cgi line 3. [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] BEGIN failed--compilation aborted at /home/makoji/makoji00001/www/calendar.cgi line 3. [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Premature end of script headers: calendar.cgi Calendar/Simple.pmが@INCの中に無いとエラーが出ています。3行目でコンパイルに失敗したのもやはりCalendar/Simple.pmです。 @INCにCalendar/Simple.pmのパスを通すためにcgi頭で use lib "/home/makoji/makoji00001/myperl/lib"; を宣言しているわけです。 で、SSHを用いてコマンドラインから実行すると作動します。 なのに、何でブラウザからだと500 Internal Server Errorが出るのでしょう。 そもそも use CGI::Carp qw(fatalsToBrowser); と宣言しているのに500 Internal Server Errorが出るというのも可笑しな話です。 何に問題があるのでしょうか。 ちなみに.bashrcは以下のようになっています。 # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions export MANPATH=/home/makoji/makoji00001/myperl/man export PERL5LIB=/home/makoji/makoji00001/myperl/lib お手数をお掛けします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> #! /usr/bin/perl -w > use Calendar::Simple; > ... > use lib "/home/makoji/makoji00001/myperl/lib"; use lib の実行順が逆で、@INC にパスを追加する前に use Calender::Simple; の行が実行されてしまいます。 use lib の行を移動してみてください。しかし、No1 の方が書かれているように必ずしも実行できるようになる とは限りません。 > レンタルサーバー上のこのCGIをSSHで > perl calendar.cgi > とやるときちんと作動します。 コマンドラインで実行できるのは、.bashrc の中で PERL5LIB を設定しているからです。例え use lib の行が なくても、コマンドラインからは実行できると思います。しかし、PERL5LIB の設定は、自分の環境だけに有効 で Web サーバには関係ありません。
その他の回答 (2)
- Toshi0230
- ベストアンサー率51% (836/1635)
私もperl scriptのパーミッション設定が不適切、という説に1票。 httpd でCGIを起動するアカウントでは、問題のモジュールへのアクセス権が無いのではないかと。 ま、現象から推測しただけなので外しているかもしれませんが。
- mnabe
- ベストアンサー率33% (427/1283)
いくつかの情報が無いので憶測になってしまいますが、 1. HTTPd の権限不足 一番可能性があると思うのですが、例えば、Apache で動かしているとして、アクセスする CGI や Lib 達に適切なアクセス権限を与えていますか? 2. 実は、"/home/makoji/makoji00001/myperl/lib"; が絶対パスではなくて、HTTPd からは違うパスに見えている。バーチャルサーバなんかを使っている時に発生します。以前、自分が同じ問題で嵌った事があるのでね。
補足
アドバイスありがとうございます。 パーミションは calendar.cgiが755、 Simple.pmが555、 .bashrcが644 です。 サーバーはレンタルで Linux CentOS 5.2 です。 パスの方は "/home/makoji/makoji00001/myperl/lib"; "/home/makoji00001/myperl/lib"; "/home/myperl/lib"; の3つを試してみましたが、やはりダメです。
お礼
パスの行を上に持っていったところ、エラーログの内容が変わりました。 Sat Jun 13 12:41:18 2009] [error] [client 114.162.47.49] malformed header from script. Bad header=$VAR1 = [: calendar.cgi 一瞬、まだエラーがあるのかよ~と思ったのですが、考えてみれば、件のプログラムはブラウザ上で閲覧できるためのHTML文を何らサポートしていません。 そこでプログラムを書き換えました。 #! /usr/bin/perl -w use lib "/home/kojima/kojima00001/myperl/lib"; use Calendar::Simple; use CGI::Carp qw(fatalsToBrowser); use Data::Dumper; use CGI; $q=new CGI; my @curr=calendar; print $q->header, $q->start_html('Test of Calendar::Simple'), Dumper(@curr); $q->end_html; これでブラウザ上でもキチンと表示できるようになりました。 ありがとうございます。