ファイルopenができません

このQ&Aのポイント
  • CentOS3.8、Apache2.0、perl5.8.0、SeaMonkey1.0.3の環境で、webブラウザからhttp://localhost/test.plを表示しようとしています。しかし、test.plの中でtest.htmlをopenさせる際にエラーが発生し、表示ができません。
  • エラーログでは「システムエラー、test.htmlファイルを開くことができません」と出力されており、ブラウザのコンソールにもエラーが表示されません。
  • 他のperlプログラムやtest.html自体は正常に表示することができるため、なぜtest.plからtest.htmlを開くことができないのかが問題です。
回答を見る
  • ベストアンサー

ファイルopenができません

webブラウザから http://localhost/test.pl と打って、perl_CGIを表示させようとしているのですが、どうもtest.plの中で、test.htmlをopenさせるところでエラーとなってしまい、表示できません。Apacheのエラーログでは「システムエラー、test.htmlファイルを開くことができません」としか出力されないし、ブラウザのコンソールでもエラーがでないので、困っております。なぜファイルが開けないのでしょうか???どうぞ宜しくお願いいたします。 【環境】 CentOS3.8、Apache2.0、perl5.8.0、SeaMonkey1.0.3 httpd.confで設定したデフォルトルート直下に、test.plとtest.htmlが存在します。 【その他現状説明】 ・test.html自体をブラウザで表示させることは可能です。 ・test.pl, test.htmlと同じディレクトリにある別のperlプログラム("hello"と出力するような簡単なもの)をブラウザで表示させることは可能です。 ・以前は、test.htmlの中で、「width=100」となっていてエラーがでていたので、「width='100px'」と変えたところブラウザのコンソールからエラーが消えたという経緯があります。

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

open に失敗した直後に $! という特殊変数を見るとエラーの原因がわかります。 open my $fh, '<', 'test.html' or report_err($!); な感じにして、 sub report_err { my $msg = shift; print <<EOS; content-type: text/text; error = $msg EOS exit(1); } でエラーの原因を探ってみてください。 CGI.pm 使っていると CGI::Carp qw(FatalsToBrowser); で、単純に dieできるんですが。

BIGMON
質問者

お礼

回答ありがとうございます. 返信遅くなってすみません. 上記のようにやってみたところ, error = そのようなファイルやディレクトリはありません とでてしまいました. httpd.confの設定に問題ありということでしょうか. ●httpd.confの関連しそうな記述は以下があります. <Directory "(ここにdocumentRootのPATH)"> Options Indexes ExecCGI FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> ●perl.confの関連しそうな記述は以下です. <Files *.pl> SetHandler perl-script PerlResponseHandler ModPerl::Registry </Files>

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

CGI用のスクリプトは専用のディレクトリ cgi-bin とかに放り込むのが 多いのじゃないかと思うのですが、どうでしょう? ブラウザから開くときはhttpdがよろしくやってくれるかもしれませんが、 CGIスクリプトから見るときにはそういう調整は入りません。 標準モジュールの Cwd を使って、スクリプトがおかれているディレクトリを 確認し、 それが開こうとしている htmlファイルの場所と違っていないかを確かめてください。 sub report_err { use Cwd; my $msg = shift; my $dir = getcwd; print <<EOS; content-type: text/text; error = $msg script is in $dir EOS exit(1); } てな感じで。

BIGMON
質問者

お礼

>CGI用のスクリプトは専用のディレクトリ cgi-bin とかに放り込むのが 多いのじゃないかと思うのですが、どうでしょう? おっしゃるとおりなのですが、現在、既にあるプログラム類を、RedHat7.2からCentOS3.8へ移行する作業をやっており、前の環境で同じディレクトリに置いてあるため、それを踏襲しております。動作さえすれば、変更しても悪くはないのですが。。。 上記のようにやってみたところ、 script is in / とでました。htmlファイルもドキュメントルートに置いてあるのですが・・・。念のためopenのところでtest.htmlをフルパスにしてみたら、表示ができるようになりました!昔はなんでフルパスでなくて大丈夫だったのか謎ですのでちょっと調べてみようと思います。 ありがとうございました。大変助かりました。

関連するQ&A

  • apache利用時に、フルパスを書かないとファイルopenができない?

    httpd.confで設定したデフォルトルート直下に、test.plとtest.htmlが存在する状態で、ブラウザで http://localhost/test.pl と打つと、test.plのスクリプト内の open(FILE, "test.html") の部分によってtest.htmlを開く処理が行われるはずなのですが、 「test.htmlがありません。」というようなエラーが出てしまい、ブラウザに実行結果を表示できません。カレントディレクトリは/であると認識しているようです。 test.htmlを絶対パスで記述すれば、開くことができます。 絶対パスを記述しないでtest.htmlを開くにはどのような設定が必要でしょうか? ※動作環境は、CentOS3.8、Apache2.0、perl5.8.0、SeaMonkey1.0.3、mod_perl1.99です。 ※質問内容は、以前perlカテゴリで「フルパスを書かないとファイルopenができない?」 ​http://oshiete1.goo.ne.jp/qa2967916.html と同じですが、内容がapacheの設定に関係しそうなため、こちらのカテゴリに移動させていただきました。

  • フルパスを書かないとファイルopenができない?

    以前「ファイルOPENできません」という質問をさせていただいた者です。 http://oshiete1.goo.ne.jp/qa2954712.html フルパスを書けば、ファイルOPENできるようになったのですが、フルパスを書かかなくともファイルをOPENできるようにしたいと思っております。いろいろ調べてみたのですが、どうしてもわからなくて困っております。関係ありそうな設定箇所をご存知でしたらお教え願いたく思っております。どうぞ宜しくお願いいたします。 動作環境は、CentOS3.8、Apache2.0、perl5.8.0、SeaMonkey1.0.3、mod_perl1.99です。 httpd.confで設定したデフォルトルート直下に、test.plとtest.htmlが存在します。test.plに以下の一文を追加することにより、test.htmlをOPENさせたいと思っております。 open(FILE, "test.html")

  • mod_perlでファイルが開けない

    拡張子.plをapacheのmod_perl2で動作するようにしました。 printでHTMLタグの出力などはできますが、openすると403になります。その403も、何かよく分からない英文と同時に表示されていました。 httpd.confで.plを普通のCGIで動作させたならopenできたので、mod_perl2を使うとopenできなくなるということまでは分かりました。 openできるようにするためにはどのようなことを試せばよいですか?

  • activeperl5.6が起動できない

    activeperl5.6が動きません。 activeperlをインストールして、apacheのhttpd.confの中身を本を参考に編集しました。 sampleのhello.plというファイルを自分の環境ではc:\www\cgi-binというフォルダーの中にいれ、 ScriptAlias /cgi-bin/ "C:/www/cgi-bin" <Directory "C:/www/cgi-bin"> AllowOverride None Options None AddHandler cgi-script .cgi .pl でcgiの実行を許可して AddType application/x-httpd-cgi .cgi AddType application/x-httpd-cgi .pl で拡張子とperlを関連付けています。 browserからたとえばhttp://localhost/hello.plを入力すると 実行が許可されていないとブラウザーで表示されます。 Forbidden You don't have permission to access /test.pl on this server. Apache/1.3.39 Server at localhost Port 80 アパッチのエラーログを見ると、 [error] [client 127.0.0.1] couldn't spawn child process: c:/

    • ベストアンサー
    • CGI
  • httpd.conf 設定

    自宅サーバで設定するhtmlフォルダをドライブCの直下に wwwというフォルダをつくってあるのですが、 その場合のhttpd.conf 設定を教えてください。 またperlもインストールして、plファイルも動かしたいと思っているのですが、 その場合plファイルはwwwのフォルダの中でいいのでしょうか? そしてhttpd.confの書き換えはどういう文章を入れればいいのでしょうか? 曖昧な表現になってしまってすいません。

  • Perl require 共通の変数 外部ファイル

    ファイルが多くなってきて、その中でも共通の変数があるので 外部ファイルにまとめたい・・・ ~test.pl~ #!/usr/bin/perl require("testcommon.pl"); print qq(Content-type: text/html\n\n); print <<END; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=$CHARSET"> <title>外部CGIファイル読み込み</title> </head> <body> END print qq($test<br>$data<br>$NEW); print <<END; </body> </html> END exit; 1; ~testcommon.pl~ #!/usr/bin/perl $test = "テスト"; $data = "テストです"; $CHARSET = "UTF-8"; $NEW ="サーバー"; 1; まずこれが現在テスト中で サーバーAでは、これでいけているのですが、 サーバーBでは、これではいけず、 エラーログを見ると 「@INC~/usr/local/lib64/perl5~」 とでてます。これがどのような意味をささしているのかわからないです。 いつも1行目に書く「#!/usr/bin/perl」の部分を書き換えてみたのですが・・・ さらにサーバーBでは、ログファイルなど開く際、フルパスでないと開けません。 require("testcommon.pl");←これですと インターネットサーバーエラーとなってしまいます。 これはエラーログを見るとフルパスで指定と書いていたので、 require("/path/path/path/testcommon.pl"); のようにしました。 これで、一応表示はできたのですが、 testcommon.plで新しい変数を書き加えると、($NEW123 = "追加したい変数";) 表示されません。 またCHARSETでUTF-8を指定してますが、 更新や、再度ページに入ったりすると、 CHARSETの変数が反応していなかったりしています。ページでソースを確認すると 変数の部分が空欄になってます。 これは require("/path/path/path/testcommon.pl"); が読み込んでいなかったり読み込んでいたり もしくは、一度なにをしたのかわからないですが、このフルパスの場所に testcommon.plのファイルをおいて、そのときのままになっている など、原因、対処がわからず困っております。 ※というより結論としては、 共通の変数を1つのファイルでしようしたいということです。 ~common.pl~ $a = 123; $b = "テスト"; $c = 2; ~test1.pl~ $TEST = $a * $c; print "$b$TEST\n"; #結果「テスト246」 ~test2.pl~ $TEST123 = $a + $c; print "$TEST123$b; #結果「125テスト」 このような感じ・・・(+_+)

  • エディダソフトで作成のファイルをコマンドプロンプトで表示出来ない。

    perlの勉強を始めたばかりです。 エディダソフト Terapadをインストールし、perlのファイル ○○○.plを作成し、コマンドプロンプトで表示しようとしても、 そのファイルの1つ前のフォルダまでは行けますが、最後の.plファイルを表示させようとすると、 can't open perl script c:\documents :no such file or directory と表示が出て、命令できません。 どうすれは、エディダで作成した.plファイルを反応させることが出来るのでしょうか。  (perlはインストールしています。)  (apacheはインストールしていません。)

    • ベストアンサー
    • Perl
  • NTでapacheとperlをインストールしてCGIテスト

    WINDOWS NTの環境でネットに繋がっていない状態でCGIテストをしようと、apache_1_3_12_win32.exe (Apache 1.3.12 for Win32) とActivePerl 623をダウンロードしセットアップしました。 Apacheの動作確認までできました。 ところが、CGIが動きません。 DOSで「xx.pl」は動いているのに、「xx.cgi」をテストしようとブラウザでみてもエラーが出てしまいます。 セットアップした2つの場所は、c:\www\perl\ と、c:\Apache\です。 何が間違っているのでしょうか? どなたか詳しく教えて頂ける方がいらっしゃいましたら、大変ありがたいです。 ブラウザのエラーは 「Internet Server Error The server encountered an internal error or misconfiguration and was unable to complete your request~」というような表示です。 また違う者が前にsendmailを入れたようなのですが、その中にもapacheが入っていました。 またperlもcドライブに入っているのですが、これはまずいでしょうか? お助けください。よろしくお願いします。

  • apacheでcgiがうまく動かない。cgiが認識されていない?

    すいません、多分基本的な所なのですが、 どうしても分からないので質問させてください。 ■環境------------------------------ ・windowsXP sp2 ・apache1.3.33 C:\Program Files\Apache Group\Apache  現在の状態:html表示可能。httpd.confを変更 ・perl5.6.1 c:\perl  現在の状態:PPMにてimagemagick,DBI,DBD-MySql(だっけ)をインストールしている ・php5.0.4 c:\php ・mysql4.02 C:\mysql ■httpd.confの変更箇所-------------------------------- 337 Options Indexes FollowSymLinks MultiViews ↓ Options Indexes FollowSymLinks ExecCGI MultiViews 538 #!c:/program files/perl/perl ↓ #!C:/Perl/bin/perl 720以降に追加 AddType application/x-httpd-cgi .cgi AddType application/x-httpd-cgi .pl 825以降に追加 AddHandler cgi-script .cgi AddHandler cgi-script .pl ■printenv.plの内容-------------------------------- #!C:/Perl/bin/perl ## ## printenv -- demo CGI program which just prints its environment ## print "Content-type: text/plain\n\n"; foreach $var (sort(keys(%ENV))) { $val = $ENV{$var}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "${var}=\"${val}\"\n"; } -------------------------------------------------- 上記のような環境で、いまPERLの動作確認を行っています。 http://localhost/cgi-bin/printenv.pl http://localhost/cgi-bin/printenv.pl PLファイルを指定しても実行されず、ダウンロードされてしまいます。 cgiに拡張子を変えても同じでした。 エラーというわけでもない為、エラーログにも何もかかれません。 何が問題なのでしょうか?

    • ベストアンサー
    • CGI
  • bad interpreter:エラーについて

    -bash: ./test.pl: usr/bin/perl: bad interpreter: というエラーについてです。 掲題のエラーが出てしまい、perlが動かないので困っています。 どうすればいいのか教えてもらえませんでしょうか。 【状況】 VMwareplayer3.1.2上で、CentOS5.5を動かし、デフォルトで入っているperlを使ったファイル「test.pl」を作っています。 test.plを実行しようとしているのですが、以下のエラーメッセージが表示されます。 -bash: ./test.pl: usr/bin/perl: bad interpreter: そのようなファイルやディレクトリはありません 実行した際のコマンドは./test.plです。 test.plの中身は以下。 ------------------------------------------------------ #!/usr/bin/perl use strict; use warnings; my $name = "morifuji"; print "Hello ". $name . "\n"; ------------------------------------------------------ 【確認済み事項】  test.plの置き場所は/usr/bin/perlです。  ls -lで権限をみたところ、rwxr-xr-x furukawa root 4096となっている。  perl test.plと命令するとエラーは返らずちゃんと表示されます。  (perlを省いて、test.plと命令するとエラーになる。これだと、webから表示されたときに動きません)  FTPとかで転送すると文字コードの問題でバグが出る、という風な記事を見かけたが、VMwarePlayerなのでそういったやりかたはしていない。  which perlと命令してperlの場所を探したが、 /usr/bin/ にある。

専門家に質問してみよう