CGI-BBS > 電子掲示板 > 簡易BBS > まささん、すいません。 まだ、不具合が・・・。


カレッヂ
カレッヂ


質問者 クレヨンしんのすけ  投稿日 2/20(火) 00:12:39
たびたびすいません。
[New]画像のことですが、私は自分のパソコンのIE5.0を使って
掲示板をチェックしていました。
ローカルPCから、掲示板にアクセスすると、作成したnew.gifはうまく表示されるのですが、別のパソコンからみると、×印が出ておりました。
また、ローカルPCからネットスケープ4.6で見ると、画像は表示されてませんでした。

minibbs.cgiを
<img src=\"D:/public_html/cgi-bin/new.gif\" >
に変更しました。


ブラウザのソースを見ると
<img src="D:/public_html/cgi-bin/new.gif"> 
になっていました。


ちなみにpublic_htmlのアクセス制御は
administrator  Full Control
Iuser_******   読み取り、実行   [←インターネットゲストアカウント]
 
/dada/data.cgi のみ
Iuser_******   変更

にしてあります。


何か対策がありましたら、教えて下されば幸いです。


回答者 羊相談員  [削除]  投稿日 2/20(火) 10:40:59
>ブラウザのソースを見ると
><img src="D:/public_html/cgi-bin/new.gif"> 
>になっていました。

これは絶対パスで指定しているのが原因ではないでしょうか?
回答者 まさ  [削除]  投稿日 2/20(火) 11:50:22
>[New]画像のことですが、私は自分のパソコンのIE5.0を使って
>掲示板をチェックしていました。
>ローカルPCから、掲示板にアクセスすると、作成したnew.gifはうまく表示されるのです
>が、別のパソコンからみると、×印が出ておりました。
>また、ローカルPCからネットスケープ4.6で見ると、画像は表示されてませんでした。

ちょっとわからないことがあるのでお聞きしますが、ここに書いておられる自分のパソコン、
ローカルPCのパソコン、別のパソコンは一体どういった構成になっているのでしょうか?

わたしが勝手に思うに、自分のパソコンがサーバーで他がクライアントだと思うのですが、
それでいいのでしょうか? そしてイントラネット上でCGIを動かしていると。
しかしどうもローカルPCと別のパソコンとの違いがわかりません。

もしもLANで不具合が出ているのであれば、それはIISの設定ですね。
グローバルIPを振っていないとか。
しかしCGIが動いて画像だけが表示されないとなると話はややこしいです。
そのクライアントのパソコンにはUNIXのものもありますか?

>minibbs.cgiを
><img src=\"D:/public_html/cgi-bin/new.gif\" >
>に変更しました。

> 以下略


こちらの方は別に問題ないです。
しかしこれはわたしも疑問に思っていましたが、なぜIISではパスの指定を絶対パスで
指定してやないと動かないか?
それは恐らくIISがCGIを動かしているディレクトリーを知らないからだと思います。
相対パスが使えると言うことは、基準になるディレクトリーがあるわけですから、それが
設定されていないと思います。

ここまではわかるのですが、じゃあ何処で設定するのと言われると困りますね。
わたしはそのままにして、絶対パスで全て書きましたけど、しかし私の場合はLAN上では
なく自分のパソコンだけでしたから問題ないですが、2000を使って本格的にサーバーとして
使いたいとなるとそれでは不便だと思います。何とかした方がいいですね。

ちなみに手としとは、IISを使わずにApacheを使うと言うのもあります。
このCGIを動作テストしたわたしの環境は、Apacheでした、そこでは普通に相対パスが使
えました。しかし画像が出ない問題とは直接関係ないでしょう。

質問者 クレヨンしんのすけ  [削除]  投稿日 2/20(火) 11:50:52
ありがとうございます。
他のPCから見てもばっちりNewマークが出ておりました。
ついでにNetScapeもばっちりでした。


おせわになりました。

質問者 クレヨンしんのすけ  [削除]  投稿日 2/20(火) 12:21:10
私とまささんのレスが30秒差ぐらいで投稿されたようで・・・。
まささんのレスを見ずに、羊相談員さんのレスだけしかみえてませんでした。

おっしゃるとおり、サーバー&クライアント関係があいまいでしたね。
失礼しました。

私は学校の研究室のWindows2000Serverを主に使っています。
そのマシンでIISを起動しております。
.cgiをいじっては、IEで確認するという作業を繰り返していました。
それで、ローカルPC=Win2000server、他のパソコン=研究室にある他のPC
という風に書いておりました。
以後気を付けたいと思います。

研究室内のパソコンはすべてグローバルIPを割り振ってあります。
UnixはNetBSDインストール中のSun Sparc classicが転がっております。
osがsun 4.1.3Cなので、あまりにも設定がややこしいので・・・。


話がわき道にそれましたので、本題に戻ります。
minibbsのことですが、羊相談員さんの返事にあったように相対パスで指定すると
うまく表示されました。
私はrequire等が絶対パスだったので、当然画像も絶対パスで指定するものだと思ってしました。でも、それは間違いだったようです。
IISって良くわかりませんね。
統一してくれればいいと思うのですが・・・。

あと、apacheもインストールはしたのですが、起動したのを確認してstopさせています。
httpdを二つも立ち上げるのはどうかと思うので、どちらか一つにしようと思い、
apacheをいれたものの、やっぱりIISが使いやすいかな?という結論に達していました

パスの指定の問題はIISのバグなのか不具合なのか、それともこんなものなのか。
どなたかご存知でしたら教えてください。


回答者 しあわせのツボ  [削除]  投稿日 2/20(火) 13:23:27
スクリプトから見ると、(相対パスで動かないなら)絶対パスが必要です。
しかしクライアントからすると、絶対パスでは自分のローカルドライブを探しに行くしかありません。
逆に相対パスかURIでないと、どのサーバを見に行けばいいのかわかりませんから。

従って、サーバ内部で必要なものは絶対パス、HTMLとしてクライアントに送るデータは相対パスにすれば、正しく動作するはずです。
jcode.plはサーバがスクリプトを動作させるのに必要なものなので絶対パス、new画像のIMGタグはクライアントが理解しなければならないので相対パス、になりますね。
回答者 まさ  [削除]  投稿日 2/20(火) 13:50:41
IISの方が使いやすいですか。
わたしはApacheの方がいいですね。

IISはNT系だけのものですので、わたしとしては何か独立しているような感じがしてなかなか
馴染めません。
しかしこればっかりは好みの問題なので何とも言えませんね。

シェアで行くならApacheですね。聞くところによるとプロバイダーを始め多くのサーバーの
httpdにはApacheが使われています。ほとんど5割近くのシェアだと思います。
しかし設定(httpd.confや.htaccess等)がGUIで出来ないので、例えばDOSに馴染みの無い人
には抵抗があるかも知れません。

その点IISの方は設定が全てGUIでできるので簡単です。単純にイントラネットのサーバーにNT
を使うぐらいならLinuxを入れてApacheを設定するより簡単かもしれませんね。

さすがにわたしはプロバイダーでNTを使っているところは引きますけどね。

----------------------------------------------
しあわせのツボさんへ

>jcode.plはサーバがスクリプトを動作させるのに必要なものなので絶対パス

わたしはrequireするものは@INCに居場所を教えれば絶対パスは必要ないと思いますけど、
違うでしょうか?
これはNTでもUNIXでも同じだと思います。

@INCはrequireやuseする時にperlが見に行くパスですよね。
そこにたとえばjcode.plのあるディレクトリーを指定していれば、

require 'jcode.pl';

とパスも何も記述せずに動作すると思いますが。それともIISだけは別物ですかね。

NTでも

push(@INC, 'ディレクトリ');
require 'jcode.pl';

とすることが出来るような気がしますが、今手元にNTがないので試せません。

それとIISでperl.exeにマッピングしている場合はカレントディレクトリを見てくれません
よね。これを例えばCGIが動いているディレクトリーに替える方法はないのでしょうか?

これが出来ればいろいろと都合がいいように思うのですが。
質問者 クレヨンしんのすけ  [削除]  投稿日 2/20(火) 15:33:02
以下はhttp://www.harukaze.net/~mishima/perl/win/iis.htmlからの引用です。
-----------------------------------------------------------------------
<質問>
require 'jcode.pl';
Can't  locate  jcode.pl  in @INC at d:\xxx
というメッセージが出ます。使用環境は、ActivePerl + MS-PWS + Win98 です。

<回答>
jcode.plを置いているディレクトリが@INCのパスになく、見つからないというメッセージです。 WWWサーバがMS-IIS/PWSの場合、「カレントディレクトリ」が(仮想)ルートディレクトリに強制的に変更されるようです。つまり、CGIスクリプトが(仮想)ルートディレクトリではないディレクトリにある場合、jcode.plがCGIスクリプトと「同じ」ディレクトリにあっても、そのディレクトリは「カレントディレクトリ」ではないため、上記エラーになるわけです。
対応策としては、

●フルパスでjcode.plを指定する。('C:/cgi-directory/jcode.pl' 等)
●requireの前にchdirでカレントディレクトリをjcode.plのあるディレクトリに変更する
●jcode.plを@INCにセットしてあるライブラリディレクトリに置く。
●requireの前に、use lib 'TARGET-DIRECTRY';で、jcode.plを置いているディレクトリを@INCに含める。
-----------------------------------------------------------------------ここまで
とあります。

カレントディレクトリを変える方法でもいいようですね。



質問者 クレヨンしんのすけ  [削除]  投稿日 2/20(火) 15:41:37
しあわせのツボ  さんへ
>スクリプトから見ると、(相対パスで動かないなら)絶対パスが必要です。
>しかしクライアントからすると、絶対パスでは自分のローカルドライブを探しに行くし >にいくしかありません。逆に相対パスかURIでないと、どのサーバを見に行けばいいのか>わかりませんから。

ソースを眺めていると、おっしゃっている意味がやっとわかりました。
ありがとうございます。



回答者 しあわせのツボ  [削除]  投稿日 2/20(火) 16:03:21
>まささん

相対パスで動かないなら、という前提でお話ししましたので。
もちろん、パスを書かなくても@INCでよろしくやってくれれば(要はPerlがjcode.plがどこにあるのかさえ認識できれば)どちらでも構いません。

細かいことですが、@INCに直接pushをかけないよう推奨されていたと思います。
回答者 まさ  [削除]  投稿日 2/20(火) 18:00:54
クレヨンしんのすけさん

●requireの前に、use lib 'TARGET-DIRECTRY';で、jcode.plを置いているディレクトリを@INCに含める。

これ以外の3つについてはわかりますが、これは知りませんでした。
いろいろ勉強になります。

---------------------------------------------------
しあわせのツボさん

>細かいことですが、@INCに直接pushをかけないよう推奨されていたと思います。

あまり@INCを触ることはないですが、わたしは直接pushしていましたね。

useの場合は、
BEGIN{ push(@INC, 'ディレクトリ'); }として、
requireの場合はBEGINなしで直接pushしてました。

これは、結局クレヨンしんのすけさんの上記の方法と同じですね。
あの対策の中にはどこにもpushしろと書いていませんでしたから、やはり直接pushは避けた
方がいいのでしょうね。

今後直接pushは避けたいと思います。
質問者 クレヨンしんのすけ  [削除]  投稿日 3/4(日) 03:13:03
お礼が遅れて申し訳ありません。

皆様のおかげで、掲示板は快調に動いております。
ありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技