<このサンプルの概要>
ホームページにどこのリンクから来たか?アクセスログを出力/表示するサンプルソース
です。CGI はperl、スクリプトはJavaScriptで記述しています。「アクセスログ出力サン
プル(perl)」は URL パラメタでJavaScriptのアクセス元URL(document.referrer)を受
け取りログ出力します。ソース中のpoint.gif には小さくてページ表示の邪魔にならない
イメージを指定します。自サイト以外のアクセスログを出力しないように自サイトチェッ
クをしていますのでerror.gif にエラーを意味するイメージを指定します。「アクセスロ
グ表示サンプル(perl)」は、「アクセスログ出力サンプル(perl)」で出力したログをHTML
形式でブラウザに表示します。不正アクセス防止のためパスワードチェックを行なってい
ます。表示形式としてはHTMLのtableタグ を使用した形式とタブ区切りのテキストデータ
そのままの形式があります。タブ区切りのテキストデータそのままの形式はブラウザのソ
ースをエクセルに貼り付けて解析する時に便利な形式です。
★アクセスログ出力サンプル(perl)
#!/usr/local/bin/perl
#---------------------------------------------------------------------
# ファイル名:NONfrom.cgi:アクセスログ出力 Ver1.00
#
# 更新履歴:
# 2007.06.09 Ver1.00 初版。 作成者(のん)
# 2007.06.09 Ver1.00 更新履歴の例 変更者(のん)
#
# Copyright (c) 2007 のん
# 種 別 :フリーソフト
# 著作権 :著作権は放棄しません。
# ファイル名の変更は禁止します。使用・改造・再配布は制限し
# ませんが、改造したものを配布する場合は更新履歴をいれてく
# ださい。
#
# 機能概要:ホームページにどこのリンクから来たか?アクセスログ出力
#
# パラメタ:from----アクセス元URL(document.referrer)
#
# 起動方法:
# アクセスログを出力するページの最後に以下のスクリプト記述します
# <script language="JavaScript"><!--
# document.write(
# "<IMG SRC=\"http://xxx.xxx.xxx/NONfrom/NONfrom.cgi?from="+
# document.referrer+"\">");
# // --></script>
#
# ファイル: アクセスログファイル(data/YYYYMMDD.txt)
#
# インストール方法:
# NONfrom.cgiの $site="nonsoft.la.coocan.jp"; の部分を自サイト
# のURL に変更します。NONfrom.cgiと関連ファイルをCGIが動作するディレ
# クトリに置きます。NONfrom.cgiファイルに実行権を与えます。NONfrom.c
# giと同じディレクトリにdataディレクトリを作成します。
#
#---------------------------------------------------------------------
# 入力情報を取得
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
$str = $str . "&" . $ENV{'QUERY_STRING'};
}elsif($ENV{'REQUEST_METHOD'} eq "GET") {
$str = $ENV{'QUERY_STRING'};
}
$ip = $ENV{REMOTE_ADDR};
$my = $ENV{HTTP_REFERER};
# 入力情報を個別に定義
$fs = " ";
if( $str ne "" ){
%cgi = "";
@part = split( '&' , $str );
foreach $i (@part) {
($variable,$value) = split('=',$i);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
# &jcode'convert(*value, 'euc');
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/"/"/g;
$value =~ s/'/'/g;
$value =~ s/\015\012/\012/g;
$value =~ s/\015/\012/g;
if( $cgi{$variable} eq "" ){
$cgi{$variable} = $value;
}else{
$cgi{$variable} = $cgi{$variable} . $fs . $value;
}
}
# 起動情報の個別定義
$from = $cgi{'from'};
}
# 不正アクセス防止のため自サイトのURLチェック
$site="nonsoft.la.coocan.jp";
if( !($my =~ m/$site/) ){
# エラーのイメージを呼び出し元に返す
print "Content-type: image/gif\n\n";
open(IN,"error.gif");
binmode(IN);
binmode(STDOUT);
print $_ while (<IN>);
close(IN);
exit;
}
# ダミーのイメージを呼び出し元に返す
print "Content-type: image/gif\n\n";
open(IN,"point.gif");
binmode(IN);
$| = 1;
binmode(STDOUT);
print $_ while (<IN>);
close(IN);
# アクセスログ出力(ファイル名:YYYYMMDD.txt)
# フォーマット(日時、アクセス先URL、アクセス元IP、アクセス元URL)
local($now)=time();
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
$mon++;$year+=1900;
local $date = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec);
local $date_f = sprintf("%04d%02d%02d",$year,$mon,$mday);
$from_file = "data/$date_f.txt";
open(OUT, ">> $from_file");
print(OUT "$date\t$my\t$ip\t$from\n");
close(OUT);
exit;
★アクセスログ表示サンプル(perl)
#!/usr/local/bin/perl
#---------------------------------------------------------------------
# ファイル名:NONfromDsp.cgi:アクセスログ表示 Ver1.00
#
# 更新履歴:
# 2007.06.09 Ver1.00 初版。 作成者(のん)
# 2007.06.09 Ver1.00 更新履歴の例 変更者(のん)
#
# Copyright (c) 2001 のん
# 著作権 :著作権は放棄しません。
# ファイル名の変更は禁止します。使用・改造・再配布は制限し
# ませんが、改造したものを配布する場合は更新履歴をいれてく
# ださい。
#
# 機能概要:ホームページにどこのリンクから来たか?アクセスログ表示
#
# パラメタ:psw----パスワード(必須)
# mod----表示形式 (default=0)
# (0=HTMLのTABLEタグを使用)
# (1=タブ区切りのテキストデータそのまま)
#
# 起動方法:
# 以下のURLを指定していします
# http://xxx.xxx.xxx/NONfrom/NONfromDsp.cgi?psw=1234567890"
#
# ファイル: アクセスログファイル(data/YYYYMMDD.txt)
#
# インストール方法:
# NONfromDsp.cgiの $PassWordOrg="1234567890"; の部分を専用のパスワー
# ドに変更します。NONfromDsp.cgi と関連ファイルをCGIが動作するディレ
# クトリに置きます。NONfromDsp.cgiファイルに実行権を与えます。NONfro
# mDsp.cgiと同じディレクトリにdataディレクトリを作成します。
#
#---------------------------------------------------------------------
# 入力情報を取得
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
$str = $str . "&" . $ENV{'QUERY_STRING'};
}elsif($ENV{'REQUEST_METHOD'} eq "GET") {
$str = $ENV{'QUERY_STRING'};
}
# 入力情報を個別に定義
$fs = " ";
if( $str ne "" ){
%cgi = "";
@part = split( '&' , $str );
foreach $i (@part) {
($variable,$value) = split('=',$i);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
# &jcode'convert(*value, 'euc');
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/"/"/g;
$value =~ s/'/'/g;
$value =~ s/\015\012/\012/g;
$value =~ s/\015/\012/g;
if( $cgi{$variable} eq "" ){
$cgi{$variable} = $value;
}else{
$cgi{$variable} = $cgi{$variable} . $fs . $value;
}
}
# 起動情報の個別定義
$psw = $cgi{'psw'};
$mod = $cgi{'mod'};
}
# 不正アクセス防止パスワードチェック
$PassWordOrg="1234567890";
if( $psw ne $PassWordOrg ){
print "Content-type: text/plain\n\n";
print "<html>\n";
print "<head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
print "</head>\n";
print "<body>\n";
print "不正アクセスはやめてください。<br>\n";
print "</body>\n";
print "</html>\n";
exit;
}
# アクセスログを呼び出し元に返す(ファイル名:YYYYMMDD.txt)
local($now)=time();
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
$mon++;$year+=1900;
local $date_f = sprintf("%04d%02d%02d",$year,$mon,$mday);
$from_file = "data/$date_f.txt";
if($mod eq "" || $mod eq "0"){
# 表示にHTMLのTABLEタグを使用
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
print "<title>アクセスログ</title>\n";
print "</head>\n";
print "<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n";
print "<table border=1>\n";
print "<tr>\n";
print "<td><font size=2><center>No.</center></font></td>\n";
print "<td><font size=2><center>日時</center></font></td>\n";
print "<td><font size=2><center>アクセス先URL</center></font></td>\n";
print "<td><font size=2><center>アクセス元IP</center></font></td>\n";
print "<td><font size=2><center>アクセス元URL</center></font></td>\n";
print "</tr>\n";
$no=0;
open(IN,$from_file);
while(<IN>){
chop($_);
@itm = split("\t",$_,-1);
$no++;
if(@itm[0] eq ""){@itm[0]="null"};
if(@itm[1] eq ""){@itm[1]="null"};
if(@itm[2] eq ""){@itm[2]="null"};
if(@itm[3] eq ""){@itm[3]="null"};
print "<tr>\n";
print "<td><font size=2><center>$no</center></font></td>\n";
print "<td><font size=2>@itm[0]</font></td>\n";
print "<td><font size=2>@itm[1]</font></td>\n";
print "<td><font size=2>@itm[2]</font></td>\n";
print "<td><font size=2>@itm[3]</font></td>\n";
print "</tr>\n";
}
close(IN);
print "</table>\n";
print "</body>\n";
print "</html>\n";
}else{
# 表示はタブ区切りのテキストデータそのまま
print "Content-type: text/html\n\n";
print "<html><head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
print "</head>\n";
print "<body>\n";
print "<pre>\n";
open(IN,$from_file);
while(<IN>){
chop($_);
print "$_\n";
}
print "</pre>\n";
print "</body>\n";
print "</html>\n";
}
exit;
★アクセスログ表示例
No. |
日時 |
アクセス先URL |
アクセス元IP |
アクセス元URL |
1 |
2007/06/09 12:49:54 |
http://xxx.xxx.xxx/SampleNONfrom.html |
999.999.999.999 |
http://search.yahoo.co.jp/search?p |
|
|