通常、我々ユーザーが接する掲示板などは、拡張子が "*.cgi" などとなっていても「ソースの表示」などで覗いて見ると、<html>のタグで始まる、まさにHTMLファイルそのものなんだけど、今回いろいろ手に入れてみたCGIファイルをエディタで見てみると、なんだか難しいプログラムのようにしか見えないぞ。
試しにこれをブラウザで・・・わはははは・・・なんだこりゃ
こりゃ、「よい子は真似しないでね」だった。
以下は、どっかで拾ってきた最もシンプルと思えるCGIスクリプト
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "Hello World\n";
exit;
これを "hello.cgi" などと "cgi"拡張子を付けてファイルに保存し、/cgi-bin/ディレクトリにFTP転送して、http://hpcgi?.nifty.com/****/hello.cgi と、呼び出してみると、
Hello World
このソースを表示して見ると、
Hello World なんでぇ、おんなじかよ、つまんねー。いや、待てよ・・・
「#!/usr/local/bin/perl」部分はコメント行だから解るとして、"print"命令で出力したはずの、「Content-type: text/html」の1行はどこ行ったんやー?
ちなみに、このスクリプトをローカルマシンで、単純にperl.exeに投げてみると、
Content-type: text/html
Hello World
ちゃあんと出てるやんけ
タグで囲まれてるわけじゃないから、ふつーのテキストとして表示されるはずなのに・・・?
どうやら、「perlスクリプトとしてperlに渡しただけの時」と、「CGIスクリプトとしてブラウザから実行させた時」とで、結果に違いがあるようです。じつは詳しくは知らないんで(中略)しますが、
ブラウザがCGIを呼び出すと、そのスクリプトの内容に従ってperl が実行され、CGIは自分の変わり身の姿をブラウザに見せに戻って来る。その時にブラウザとしては、戻ってきたのがどんな奴か判らないんじゃ表示も出来ないんで、戻ってきたコードの1行目の「Content-type: text/html」などから、その正体を判別する・・・と
まあ、そんな感じなんじゃないかと、勝手に推察しときましょう。長々と書いてしまいましたが、それらを踏まえた上でもう一度、
を、考えてみましょう・・・。
試しに、KENT WEBから手に入れた「夢カウンタ」の"dream.cgi"の中を覗いて見ると、
「printf("Content-type: image/gif\n");」との一文を見つけました。
なるほど、<IMAGE SRC="">タグで呼び出された"dream.cgi"自身が、イメージファイルの見てくれで戻って来るわけだ。
この処理の過程で、/cgi-bin/下のGIFファイルを読みに行っているはずなんですが、
読みに行ってるのはCGIで、ブラウザからは関係ない話だったのです。そう、
酒母が違う、主語が違うのでした。よって、
CGIの実行に関係のないファイルをcgi-binディレクトリに置いて、その場所を指定してもブラウザで表示させることはできません |
この文章は、まさにその通りで正しいのですが、
CGIの内部でのみ参照するファイルは、cgi-binディレクトリに置く事ができます |
と、付け加える事もできるでしょう。
そう、掲示板の"*.log"ファイルやカウンタの"*.dat"ファイル、ログ破壊防止の"*.lock"ファイルなど、ブラウザから直接参照するわけじゃないファイルは、CGIと同じ場所に置いてもぜんぜん構わないのだった。
一方、アイコン付き掲示板などでは、CGI自体は、「Content-type: text/html」付きで普通のHTMLファイルとして返って来て、アイコン画像などはその中で<IMAGE SRC="">タグで画像の場所だけが指示されている。
ということは、この画像ファイルを参照しに行く主語は、ブラウザだということです。
そして、ブラウザが直接見に行く場合は、
CGIの実行に関係のないファイルをcgi-binディレクトリに置いて、その場所を指定してもブラウザで表示させることはできません この制約に引っ掛かり、相対パスであれURL指定であれ、/cgi-bin/ディレクトリに置いた画像ファイルを表示することは不可能というわけなのでした。
うーーん、明解?ややこしいよねー