- ベストアンサー
【cgiで掲示板】datファイルに書き込めない
- レンタルサーバを利用しているが、CGIで作成された掲示板で書き込みができないエラーが発生している。Windows2000 Server+IISで動作しており、chdirの設定も行っているが問題は解決しない。
- サーバの説明書によれば、Windows2000 Server+IISではCGIとASPの動作環境を提供している。ローカル仮想サーバ上では問題なく動作しているが、実際のサーバ上ではエラーが発生する。
- 質問者は書き込みができない理由について、パーミッションの概念やchdirの設定などを疑っている。質問者は解決策を求めている。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>Can't open perl script **/**.cgi": No such file or directory このエラーメッセージだとすると単にcgiのfile名を間違えてアクセスした場合に出ますね 例:abc.cgi にacb.cgi でアクセスしようとした 普通のhtmlとちがってCGIだとこのようなメッセージになるようです >ご記入頂いたcgiは無事動きました。 という事はIISの汎用な意味でのカレントディレクトリ問題は それでOK、、だがそのサーバー独自の設定もしくは そのスクリプト独自の問題かな? ・まずサーバーの設定に関しては、その公式サイトのcgiのFAQかどこかにヒントが隠れていませんか? 例えば ・データログとして ***という名前の空Fileをあらかじめ設置しておき とか ・CGIは cgi-bin/***/ において データ(ログ)Fileは hoge/***/ 以下に置いてくださいとか? ・スクリプト独自の物については判りませんが、どこかで配布されているものなら配布URLを教えてください *そうでないなら ・ openするfileだけでなく 例えば require などもカレントディレクトリの影響を受けますので #2で書いたchdirを含む3行は #!/usr/bin/perl(もっともIISだとこの行は不要だが) のすぐ下に記述してください ・それでも駄目ならchdir 行のすぐ下に $| =1; print"Content-type: text/html; charset=Shift_JIS\n\n"; open(STDERR,">&STDOUT"); と3行書き足します それから openの記述全てに |die(__LINE__ ."行目でERRORです--") を付けてください 例: open(N,">>$path")|die(__LINE__ ."行目でERRORです--"); fileが開けないことが原因でエラーになる場合は この記述をすることによって スクリプトの何行目で失敗しているかがブラウザのウィンド内に表示されます また上記のrequire で失敗している場合は Can't locate jcode.pl in @INC (ライブラリpath)スクリプト名 line 9. <=この場合だと9行目のrequire文で失敗しています
その他の回答 (3)
- umasikajiro
- ベストアンサー率67% (545/803)
>例: open(N,">>$path")|die(__LINE__ ."行目でERRORです--"); すみません | が1本抜けてました open(N,">>$path") || die(__LINE__ ."行目でERRORです--"); または open(N,">>$path") or die(__LINE__ ."行目でERRORです--"); 取り合えずそれだけ、後はまた時間のあるときに見てみます
- umasikajiro
- ベストアンサー率67% (545/803)
数年前にIIS用に書いたスクリプトを引っ張り出してきました print "Content-type:text/html; charset=Sshift_JIS\n\n"; $Data_Path=$0; $Data_Path =~ s|[^\\]*$||; # この時点で$Data_PathにCGIのある場所のパスが入っている print "\$0 = $0 \$Data_Path = $Data_Path "; #TESTとして表示してみる print"<hr>\n"; chdir $Data_Path; # CGIのある場所にカレントディレクトリを移す # 試しに01.txtの内容を表示してみる open(R,'./01.txt'); print <R>; close (R); __END__ 取り合えずこんなのを置いて、同じディレクトリに適当な文字を書いた 01.txtを置いてから アクセスし $0 = D:\home\test01\www\01\03\test.cgi $Data_Path = D:\home\test01\www\01\03\ のような文字列と 01.txtの内容が表示されれば成功なので で、これを掲示板CGIのfileをopenする記述より上に $Data_Path=$0; $Data_Path =~ s|[^\\]*$||; chdir $Data_Path; の3行を追加するか、または chdirではなく $log = $Data_Path ."ibbs.dat"; # $Data_Path の後ろの . (ピリオド)をお忘れなく とfileをパスつきで指定してもOK
お礼
うぉぉぉぉ!!ありがとうございます!!<m(__)m> 早速家に帰ったら試してみます(すいません、今は仕事場です・・・_| ̄|○ ) さしあたり、上記にご記入頂いたスクリプトから挑戦してみます!! 本当にありがとうございます!!<m(__)m>
補足
早速試してみました!! しかし・・・今度は違うエラーが・・・。 Can't open perl script ファイルのディレクトリ/ファイル名になってしまいました・・・。何故でしょうか・・・??
- umasikajiro
- ベストアンサー率67% (545/803)
windows上のapache他のhttpdとIISではカレントディレクトリが違う事がありますので CGIがデータfileのある場所とは違うディレクトリにアクセスしているのかもしれません。 宜しければ openしようとしているfileのパスをどう指定しているか補足に書いてください 例えば $dat_file='./data.log'; とか $dat_file='data.log'; だと駄目かもしれません
お礼
何度もすいません!! 上記には出来なかったと記述しましたが、ご記入頂いたcgiは無事動きました。 しかし、実際に目的のcgiに入れると動きません・・・。メッセージも変わりません・・・。 入れ方に問題があるんでしょうね・・・。 何故でしょうか・・・。
補足
早速のご回答ありがとうございます!!<m(__)m> $log = "./ibbs.dat"; となっております。おそらく、仰っている内容の通りだと思います。 これでは他の場所にアクセスしに行ってしまっていると言うことでしょうか?? その場合の解決策は、どのような形になるのでしょうか?? 大変お手数ですが、ご教授頂ければと思います。 ちなみに、保存場所はサーバ上の d:/users/*****/Cgi-bin/bbs/になります。
補足
本当に何度もお答え頂いてありがとうございます!! ホントは、そこの会社が独自に作らせたcgiがあるんですが、とりあえずまずレンタルサーバの会社が推奨している掲示板があったので、それを使用してみることになりました。 http://www.kent-web.com/bbs/aska.html こちらになります。 中身を見ると、今回ご指摘頂いたものが入っていないんです・・・。 またご意見頂ければと思います!!m(__)m また、仰る通り、plも絶対パスにて指定しなければダメでした。 ご記入頂いた内容を含めもう少しやってみます!!