尾張電脳ワークスのブログ   ネットやPCでお仕事

電脳世界(インターネット、SEO検索エンジン対策、ウェブツール、PCの設定)について、探求していきます。

・tok2のCGI問題3

トクトクでのCGIはなぜ難しい? (WING☆様)
http://www26.tok2.com/home/wingstar/
http://web.archive.org/web/20040305143904/www26.tok2.com/home/wingstar/
(読むためには、表示されていないそのhtmlを保存し、タグ直前のscript関係を削除し、ブラウザでその編集済みファイルを表示させる)

6.トクトクで起こる3大CGI問題

トクトクの第1,2,3サーバー及びpopupサーバー以外のサーバーについて、大きくわけて、3つの問題が指摘されています。
そして新たに加わった問題が1つ出てきました。
(現在、第1,2,3サーバーは受け付けを既に終了しており、登録できません。)
1 Location問題
2 キャッシュ問題
3 Cookie問題
これらのことは、全てサポートにて解決策案がたくさん出されています。しかし、素人のみなさんには、これらのことを解決するのは、至極困難だと思います。 Location問題とキャッシュ問題に関しては、一行追加するとか、修正するだけで解決できますが、Cookie問題を解決するには、それなりのプログラム知識が必要で、その掲示板がどのような仕組みで動作しているのかを、把握しなければ改造は難しいです。つまり、既存の出来上がった掲示板、チャット、カウンターなどのCGIスクリプトを自分で改造しなければ、解決できません。改造するということは、つまり一歩間違えればサーバーダウンにも繋がる重要なことですので、慎重に作業を進めなければなりません。
こういった場合、みなさんトクトクのサーバーで試すのは、ものすごくためらうことと思いますが、それは当然です。トクトクのサーバーはテストサーバーではなく、一般に開放された公共の場だからです。普通、スクリプトを作成している作者の方々や、それなりにスクリプトを作成できる方々は、自分のパソコンでテストができるようにソフトをインストールして作業を進めています。私もそうです。ですから、まず改造をする前に、自分のパソコンでCGIをテストできる環境を整える必要がありますので、絶対にインストールして下さい。サーバーが重過ぎてトクトクを使えないというあなた。トクトクでテストしていませんか?それも原因の一つなのです。結局、苦情を出す人間にこそ、その原因はあるものです...
ここを読めば、自分のパソコンでCGIを動作させる環境が整います。Windows2000の方ならば、IISを利用して、ActivePerlだけインストールしても構いません。

6−1 Location問題について

Locationとは、Perlスクリプトの中でprint "Location: http://www.yahoo.co.jp/\n\n";と記述されているものがあるとしたら、そのprint文の中に書かれているアドレスにジャンプするという意味になるのですが、トクトクのサーバーでは、これがうまく処理されないで、正常な動作が期待できません。そういった場合、トクトクでもジャンプできるように修正しなければいけません。修正方法は以下のとおりです。
print "Location: http://www.yahoo.co.jp/\n\n";
こういった行を見つけたら、


print "Content-type: text/html\n\n";
print "";
(ブラウザーの関係上見た目は改行されているかもしれませんが、2行で
書いて下さい。)


というふうに変更して下さい。
また、
print "Location: $abc\n\n";
といった感じであれば、


print "Content-type: text/html\n\n";
print "";
(ブラウザーの関係上見た目は改行されているかもしれませんが、2行で書いて下さい。)


というふうにしなければいけません。
もう一つおまけに、
print "Location: $abc?mode=xxxx\n\n";
といった感じであれば、


print "Content-type: text/html\n\n";
print "";
(ブラウザーの関係上見た目は改行されているかもしれませんが、2行で書いて下さい。)
です。
これで、わからない人はいないですよね...

6−2 キャッシュ問題について

キャッシュとは本来、毎回サーバーにアクセスしてデータを転送してもらうという回線に負荷がかかるようなことを、過去に一度でも行ったことのあるページを PCやプロキシサーバーのキャッシュ機能により保存しておき、それを参照するようにし、サーバーや回線の負荷を軽減してくれる優れた機能のことを言います。
しかしこれが、いつまで経っても古い情報が更新されないで、掲示板等で自分が新しく投稿したのにも関わらず、自分が投稿する前のページを表示してしまい、新しい情報が表示されないといった問題が起こってます。これを解決するのは、ある一行をスクリプトの最初に追加するだけで、解決します。ただ、これでも完全に解決されるわけではなく、完全なるトクトク管理者による解決が望まれる今日この頃ですが、とりあえず現行のままということで、以下の修正を行なって下さい。


スクリプトの一番上には
#!/usr/bin/perl
とありますが、


#!/usr/bin/perl
utime time(), time(), __FILE__;
として下さい。


ただ、これでも完璧ではないので、ブラウザーの更新ボタンをクリックしたり、InternetExplorerですとCtrlキーを押しながら更新ボタンをクリックし強制的にサーバーに読みに行くようにしなければならず、ちょっと不便ではありますが、これ以上はどうしようもないので、あとは管理者様に訴えて下さい。私に質問したり、サポートで質問されても誰も何も言えません。
(Netscapeですと、Shiftキーを押しながらリロードすると、更新されます。)

6−3 Cookie問題について

Cookieとは、掲示板等で名前やメールアドレス等を入力して投稿したことがあるかと思いますが、2度目以降は名前やメールアドレスを入力しなくても、最初からブラウザーに表示されているということがあると思います。これはブラウザーにそういった情報を記憶する機能があるのですが、その機能を Cookieと言います。
トクトクでは、このCookie機能が正常に機能しないので、毎回名前やメールアドレスを入力しなければならないという、何とも面倒なことになっています。このCookie問題は、正直解決するには、それなりの技量が必要です。もし何もわからないのであれば、手を出さない方が良いと思われます。名前やメールアドレスくらい毎回入力してもらえればそれで済む話ですから...と、これで終えるのも心苦しいので、一般的な掲示板の形式をご紹介し、完璧な解説ではありませんが、それを参考にして、Cookie機能を付けたいという人は、チャレンジしてみて下さい。


☆print文を変数セットに変更する。


print "Set-Cookie: data=$data; expires=$aa, $bb-$cc-$dd 00:00:00 GMT\n";
まず、上記のような行がありましたら、
$tok2_cookie = "data=$data; expires=$aa, $bb-$cc-$dd 00:00:00 GMT\n";
のように変更して下さい。
ここまでは、恐らくどのCGIでも共通して変更は可能だと思いますが、この後の手順は、CGIの仕様によって異なります。その中でもごく一般的な3種類の掲示板をご紹介致します。


仕様1 投稿した後、いきなりLocationにて掲示板のトップページを表示するタイプ。


このタイプは結局トクトクでLocation問題があり使えないので、先にご紹介した方法を採用しながら回避する以外にありません。
下記は、その例です。


print "Content-type: text/html\n\n";
print "";
print "";#これ追加
print "";
print "";


仕様2 投稿した後、「投稿ありがとうございました」を表示するタイプ。


このタイプは、基本的に投稿した後、Locationにて先頭ページを表示するタイプと同じ対応になります。
このような掲示板では、必ずスクリプトのどこかに投稿ありがとうございました。と書かれているHTML個所があると思いますので、CookieのMETAタグを追加することで対応できると思います。
下記は、その例です。


print "Content-type: text/html\n\n";
print "";
print "";#これ追加
print "";
print "

投稿ありがとうございました。
";


仕様3 投稿した後、いきなり掲示板のトップページを表示するタイプ。

この方法はかなり厄介です。
というのも、掲示板では一つのスクリプトで、投稿できたり、表示したり、削除できたりしますので、当然モード設定を行なってるものと思われます。ですから、URIhttp://www??.tok2.com/home/????????/bbs/bbs.cgi?mode=newとなってるのを見たことがあるかと思います。まず、その投稿画面を出しているところではなく、投稿した後にmode=???の???の部分がどうなってるのかを見なければなりません。ひょっとしたら、HTMLの中にINPUTタグのHIDDENで設定されているかもしれませんので、URI上ではわからないかもしれません。そういう場合は、投稿画面でブラウザーのソース表示をすると、答えがわかると思います。その他に、そもそもmode=ではなく、abc=かもしれません。それは掲示板の作りによって違います。それを踏まえた上で掲示板のトップページを表示しているHTML部分に
print "Content-type: text/html\n\n";
print "";
#以下を追加
if ($mode eq '???'){
print "";
}
と記述してあげなければ、なりません。
もしこの辺が理解できなければ、基本的にこの改造はお薦めできませんので、そのままお使い頂くことを、強くお薦め致します。


この他、Cookie問題は掲示板の作り方によって、対処の仕方は全然違います。もしかしたら、記述の仕方が違うだけで、構造は同じというものもあるでしょう。10人10色とはよく言いますが、プログラムの世界も同じで、同じ形式の掲示板を10人に作らせても、1つとして同じプログラムはありません。人によって考え方や作り方が違うので、当然です。改造したい方は、1に根気2に根気です。是非がんばって自力解決して下さい。ちなみに、Kentwebやその他のCGI配布サイトのサポート掲示板では、改造の質問を禁止しているところがあります。そういった場合は、本当に自力解決しなくちゃいけません。自分だけなんとかしてもらおう……。そんなこと思ってたら一生できません。私も人の作ったものをわざわざ解析して、改造方法を教えられる時間は到底ありませんので、ご了承下さい。そして、なぜこんなことをここで解説するかを考えてみましょう。