|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
自分のサイトでないURLが紛れ込むことがあります。 サイト外URLを除くように修正しましょう。
実はページビューカウンターはこのサイトの全てのページに見えないように仕込んであります (^^; もともとそのために作ったわけですし、動作確認のために必要でした。 そして今日、あることに気が付きました。このサイトでないURLが混じってます。 それは、次のようなURLでした。
http://www.google.co.jp/search?q=cache:XO7RNepGa4IJ:www.perl-labo.org/+perl+labo
開いてみると分かりますが、Googleのキャッシュページです。 誰かがこのサイトを検索してくれて、キャッシュページを開いたんですね。 なるほど、検索エンジンのキャッシュページを開くと、そのURLがリンク元として ページビューカウンターでカウントされてしまうんですね。 コレ、ある意味面白いのですが、ページビューカウンターの本来の目的ではありません。 こういうURLが混じっていても嬉しくないです。 ですので、修正したいな、と思いました。
ページビューカウンターの目的は、どのページがどれくらい開かれているかを知ることでした。 上のGoogleのキャッシュページは、トップページのものですから、 トップページが開かれた、としてカウントするのが正しいように思います。 でも、GoogleのキャッシュのURLから、オリジナルページのURLを取得するっていうのも面倒だし、 検索エンジンはGoogleだけじゃないし。 ですので、このような「自サイトでないURL」を全て排除するような機能を追加したいと思います。
では、「自サイトでないURL」であることを判別するにはどうしたらいいでしょうか。 それにはいろんな方法があると思うんですが、ここでは、Googleのキャッシュページのような URLを排除する一番簡単なやり方として、? が含まれているURLは自サイトでないと判断するっていうことにします。 自サイトの中で、? を含むページ(動的に生成されるページなど)があるとそれも排除されてしまうという問題が ありますが、そのようなページの場合は直接閲覧回数をカウントすればよいですし、 とりあえず、よしとしましょう (^^;
文字列 $str の中に特定の文字列が含まれているかどうかは、$str =~ /探す文字列/i で調べることができます。
ですから、$url に ? が含まれているかどうかは $url =~ /?/i となりますね。でもちょっとまってください。
/?/ の部分、このままだとうまく動かないようでした。というのは、この部分は単なる文字列を指定するだけでは
正規表現というものを使って探す文字列を指定することができるのでした。で、? という文字は正規表現の
中でなにか特別な意味があるのかな?うまく動かないようでしたので、? を \ でエスケープして
\? とします。つまり $url =~ /\?/i ですね。これで動きました。
# v 1.02
package plab;
require 'counters.pl';
# 引数(ファイル名, 保存するログ数, ログ回転日間隔)
# ページビューをカウントします
sub countpageview
{
local $fname = $_[0];
local $nlog = $_[1];
local $logspan = $_[2];
local $count;
local $ref = $ENV{'HTTP_REFERER'};
if ($ref ne "" && !($ref =~ /\?/i)) {
$count = plab::incl_counters($fname, $ref, 1, $nlog, $logspan);
}
return $count;
}
1;
例によって、IFRAME タグを使って次のようにウェブページに仕込みます。 サイズは1x1で最小にして見えないようにしています。
<iframe src=pvcounter.cgi width=1 height=1 frameborder=0></iframe>
このページでも、ここにカウンターを仕込んでます(見えません) →
さて、次のリンクをクリックしてこのページのキャッシュを開いてみてください。 (キャッシュが無かったらご愛嬌 (^^;)
現在の閲覧回数をグラフで表示するにはこちらをクリックしてください。 こちらにGoogleのこのページのキャッシュページのURLが含まれていなければ成功です。
今回は、URLが自サイトかどうかを判定するのに ? が含まれているかどうかを調べるなんていう ちょっと怠慢な研究だったかも知れません (^^; 一番いいやり方はどんなでしょうね。
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |