• ベストアンサー
  • すぐに回答を!

コマンドラインで通っているパスがブラウザからだと通っていない

  • 質問No.5039318
  • 閲覧数211
  • ありがとう数2
  • 回答数3

お礼率 39% (76/193)

以下のような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

お手数をお掛けします。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 64% (120/185)

> #! /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 サーバには関係ありません。
お礼コメント
makoji

お礼率 39% (76/193)

パスの行を上に持っていったところ、エラーログの内容が変わりました。

 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;

これでブラウザ上でもキチンと表示できるようになりました。

ありがとうございます。
投稿日時:2009/06/13 12:59

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 51% (836/1635)

私もperl scriptのパーミッション設定が不適切、という説に1票。
httpd でCGIを起動するアカウントでは、問題のモジュールへのアクセス権が無いのではないかと。

ま、現象から推測しただけなので外しているかもしれませんが。
  • 回答No.1

ベストアンサー率 33% (427/1283)

いくつかの情報が無いので憶測になってしまいますが、

1. HTTPd の権限不足
 一番可能性があると思うのですが、例えば、Apache で動かしているとして、アクセスする CGI や Lib 達に適切なアクセス権限を与えていますか?

2. 実は、"/home/makoji/makoji00001/myperl/lib"; が絶対パスではなくて、HTTPd からは違うパスに見えている。バーチャルサーバなんかを使っている時に発生します。以前、自分が同じ問題で嵌った事があるのでね。
補足コメント
makoji

お礼率 39% (76/193)

アドバイスありがとうございます。

パーミションは
 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つを試してみましたが、やはりダメです。
投稿日時:2009/06/13 01:38
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ