※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。

■ アクセス情報の表示

今回の「アクセス情報の表示」は、この後で説明する「アクセスログの作成」に必要な情報の取得方法を解説します。

では、アクセスログに記録する情報ってどんなものがあるのでしょうか?

いろんな情報がありますが、最低限必要なものとしては、自分のサイトに、いつ、どこから、どのぐらいの人が訪問して、どんなページを見ているのかを調べられるような情報と考えられます。

また、サイトにとって好ましくない訪問者(いたずら、誹謗・中傷、荒らし)などを特定したり、自分のサイトがどういったところにリンクされてるのかを調べることもできます。

とはいえ、なんでもかんでも調べられるというものではありません。
使用する言語や相手の接続形態、自分のサーバーの環境などに大きく左右されます。
一般的に次のような情報を取得させます。

1.日付・時刻..サーバーの持つ現在の日時を使用します。
2.表示されたページ ..自サイトの訪問者が見ているページ
3.リファラー(referer)..どのサイトから訪問してきたか、俗に言うリンク元(逆リンクとも言う)。
4.訪問者のエージェント..アクセスをしたときのOSブラウザなど。
5.訪問者のホスト..プロバイダから与えられるIPアドレスに割り当てられたサブドメイン名のようなもの。
6.訪問者のIPアドレス..プロバイダから与えられる、世界に1つしかない接続番号のようなもの。

これ以外の情報も記録できますが、もっと知識が増えてからでいいでしょう。

【 解    説 】

まず、上記の中で一番厄介なのが日付・時刻です。
Perl日付・時刻を取得するには次のように記述します。
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)   = localtime(); $fmt0 = "%04d/%02d/%02d %02d:%02d:%02d<br>\n"; print sprintf($fmt0, $year+1900,$mon+1,$mday,$hour,$min,$sec);

なにやら、魔法の呪文のようですね。(笑)
というのも「CGI(Perl)の解説」で解説していない命令がいくつか出てきたからです。
それらについては、後ほど別ページで解説します。

まず、Perlで日時を取得するには「localtime()」を使用します。

「localtime()」関数は、「=」の左辺に「$tim0」などと通常のスカラー変数を持ってきた場合は次のような値が返ってきます。
Sun Mar 20 10:50:18 2005

※「localtime()」については「時間関数」のページで詳しく解説します。

ところが、今回のような書式をリストと言いますが、リスト形式で指定した場合はそれぞれの変数に数字の値がセットされます。
全部で9つありますが、左から順に次の通りです。
秒:(0〜59)
分:(0〜59)
時:(0〜23)
日:(1〜31)
月:(0〜11)
年:西暦1900年が基準で、2000年は100となる
曜日:(0〜6)日曜日が0
日数:その年の1月1日からの経過日数で、1月1日は0
夏時間調整:(0〜1)サマータイムの時1 (詳しい情報がありません)

これらをそれぞれの変数に一括でセットする場合、上記のようにリスト形式を使います。

それと、「sprintf()」関数も初めて出てきましたね。
「sprintf()」は、フォーマット(書式整形)関数で、指定した書式にしたがって文字整形を行う関数です。

詳しくは別ページで解説しますが、左端に書式を指定し、その後書式にしたがって必要な数だけ変数「,(カンマ)」で区切って列記していきます。
「%04d」はゼロ埋めされた4桁の数字に整形する時に使用する書式で、「%02d」はゼロ埋めする2桁の数字です。

それ以外の情報はほとんどPerlが持つ環境変数で取得できます。
現在表示しているページは「$ENV{'REQUEST_URI'}」で、リファラーは「$ENV{'HTTP_REFERER'}」、訪問者のエージェントは「$ENV{'HTTP_USER_AGENT'}」、訪問者のホストは「$ENV{'REMOTE_HOST'}」、訪問者のIPアドレスは「$ENV{'REMOTE_ADDR'}」で取得できます。

これらをタイトルを付けて表示するなら次のように記述できます。
print "表\示ページ:$ENV{'REQUEST_URI'}<br>\n"; print "リンク元:$ENV{'HTTP_REFERER'}<br>\n"; print "エージェント:$ENV{'HTTP_USER_AGENT'}<br>\n"; print "ホスト名:$ENV{'REMOTE_HOST'}<br>\n"; print "IPアドレス:$ENV{'REMOTE_ADDR'}<br>\n";

では、上記の内容を使用して「アクセス情報の表示」を作成してみます。
下記のサンプルでの注意点は3箇所です。
1.1行目の「#!/usr/bin/perl」はサーバーによって違いますので確認してください。
2.表示文字列の最後にある「<br>\n」はそれぞれのHTMLの改行とテキストファイルの改行です。
3.「表\示」にある「\(円マーク)」は文字化けを防ぐためのものです。

【記述サンプル】
#!/usr/bin/perl print << "END_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>アクセス情報の表\示</title> </HEAD> <BODY> END_DOC ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)   = localtime(); $fmt0 = "%04d/%02d/%02d %02d:%02d:%02d<br>\n"; print "現在の日時:"; print sprintf($fmt0, $year+1900,$mon+1,$mday,$hour,$min,$sec); print "表\示ページ:$ENV{'REQUEST_URI'}<br>\n"; print "リンク元:$ENV{'HTTP_REFERER'}<br>\n"; print "エージェント:$ENV{'HTTP_USER_AGENT'}<br>\n"; print "ホスト名:$ENV{'REMOTE_HOST'}<br>\n"; print "IPアドレス:$ENV{'REMOTE_ADDR'}"; print << "END_DOC"; </BODY> </HTML> END_DOC
◆実行結果について

上記のサンプルを「accdsp.cgi」という名前で保存して実行してみてください。

実行結果はこちらをクリックしてください。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。


page update:2010/01/23 20:32

Copyright (c) 2000-2009, all Rights Reserved & Produced by atom