SSI禁止サイトでHTMLからCGI実行


Trolley.Netのファイル本体はWakWak(NTT-ME)にあります。他の多くの商用プロバイダ同様,SSIが禁止されているため,HTMLからCGIを
<!--#exec cmd="./cgi-bin/sample.cgi"-->
のように簡単に実行することが不可能です。

一つの方法は,HTMLファイルをすべてCGIに置き換えてしまうことです。全部の行に'print "本文"\n;'などと付け加えて回ることはさすがに馬鹿げているので,HTMLファイルの内容を書いたテキストファイル"document.txt"を読み込んで行毎に切り離し,再度HTMLを生成するCGIを書けばよろしい。たとえば以下のように書けばよい訳です。

$html = "./document.txt";
open(IN,"$html") || die "error\n";
@lines = <IN>;
close(IN);
print "Content-type: text/html\n\n";
foreach $line (@lines) {
print "$line";
}
もっともこれでは何のためにCGI化する必要があるのか解りませんね。実はプロバイダが準備しているアクセスカウンタをそのまま使うと,自己アクセスがカウントされたり,ログが取れなかったり(一般に生ログは見せてくれない)不都合があります。そこでカウンタCGIを呼ぶための前処理を行うCGIが必要になります。

すなわち自己アクセスに使う特定のアドレスからの参照か否かを確認し,自己アクセスならばカウンタを動かさず,そうでなければログを採ってカウンタを進めるという操作を行います。なおここでは,よくあるアクセス解析ソフトのように,たとえば過去100アクセスだけログを保存するのではなく,延々と記録を累積します。時々ダウンロードして別途解析ソフトを走らせるという利用形態を想定しています。

まず問題の前処理を行い,アクセスカウンタ(Muquit型カウンタを想定)を呼ぶCGIは以下のように書くことができます。

#!/usr/local/bin/perl
# Pre-processing and logging for Muquit counters. (c)2002, Trolley.Net
$mainlog = "ログファイル名";
print "Content-type: text/plain\n\n";
$remote = $ENV{'REMOTE_ADDR'};
# カウントアップしないIPを指定する。'255.255.0.0'や'255.255.255.0'的指定も可。
@ignore = ('192.168','172.16.100','202.214.63.114');
$cmp_i=-1;
foreach $ignore (@ignore) {
$cmp_i = index($remote, $ignore);
# IPがignoreリストに含まれる場合,カウントアップしない指定。
if($cmp_i == 0){
$str = '<img src=\"/cgi-bin/Count.cgi?...|incr=0\" border=0>';
print "<!--\n";
print "document.write(\"$str\")\n";
print "//-->\n";
exit;
} }
# IPがignoreリストに含まれない場合,ログを採取する。
open (MAINLOG, ">>$mainlog");
( $sec,$min,$hour,$day,$mon,$year ) = localtime(time);
$mon++;
$year = $year + 1900;
$fdate = sprintf("[%04d-%02d-%02d %02d:%02d:%02d]",$year,$mon,$day,$hour,$min,$sec);
# ログの内容は適当に設定。ここではIPアドレス・年月日・時分秒・ブラウザの種類。
print MAINLOG "$remote $fdate $ENV{'HTTP_USER_AGENT'}\n";
close (MAINLOG);
# 通常のカウントアップする指定。
$str = '<img src=\"/cgi-bin/Count.cgi?...|reload=F\" border=0>';
print "<!--\n";
print "document.write(\"$str\")\n";
print "//-->\n";
exit;
この"<!--"から"//-->"までが,HTMLファイルのJavaScript部分に書き込まれるように,HTML側でCGIを呼べばいい訳です。具体的には,上のCGIを"sample.cgi"と名づければ,
<script language="JavaScript" src="./cgi-bin/sample.cgi"></script>
としてJavaScriptのソースファイルとして呼ぶことができます。単純なperlによるCGIの多くが,SSI無しでもこのやり方で実行できるはずです。
(05/16/2002記)