referer是HTTP协议中,记录用户访问当前网页前的链接地址,通过referer机制,可以把互联网的上各个节点天然自动关联成一个地图。
目前很多站点上显示的最新来源(referer)统计都是用的是:
Stephen的referrer统计系统
由于他的http://www.downes.ca/每天要承受85万的日统计访问量并承受大量的SPAM(referer作弊),因此已经关闭了referrers统计系统,但系统程序本身是基于GNU版权公开发布的,所以其实每个服务器上都可以安装(我在51.net上安装没成功)
以下是我的安装和改进简介:
目前有2个版本:
一个是1.0版本,也是我目前网站上在用的
另外一个是开发中的2.0版本,加入了对数据的支持。但是目前还没有找到安装文档。
安装:
一个是嵌入页面中的JavaScript代码referrers.js,一个是后台的CGI统计程序referrers.cgi
比如把referers.js部署在
http://www.example.com/referrers.js
其中的代码指向:
http://www.example.com/cgi-bin/website/referrers.cgi
在需要进行来源统计的页面中将
<script language="Javascript" src="http://www.chedong.com/referrers.js"></script>
嵌入就可以了
改进:如何让百度的来源得以显示
以前遇到一个问题,来源统计中来自搜索引擎的应该很多,但是没有百度的:我检查了一下发现通过以下方式可以记录。可能是百度的搜索页面baidu?word=xxx做了一些特别的设置导致了无法统计吧。
可能是因为http://www.google.com/search参数为空,Google仍然可以返回带有标题的网页,但是百度http://www.baidu.com/baidu如果没有参数,就是“找不到网页”了。所以REFERER系统在去掉参数后,就可能找不到来源。
我发现在代码中加入以下修改,按照真对类似Google的方式统计来自百度和3721的来源,搜索结果也就会有统计了:
if ($in =~ /google/ig) { $in = "http://www.google.com"; } # Standardize Google
if ($in =~ /baidu/g) {$in = "http://www.baidu.com";} # Standardize Baidu
if ($in =~ /3721/g) {$in = "http://www.3721.com";} # Standardize 3721
其实,目前的REFERER统计系统是精确到页面级的,在后面的版本中都变成域名级的了。
另外:字符集问题
由于JS的显示页面和来源页面的字符集不一致:比如来源网站是简体中文GBK字符集,而JS嵌入的页面是UTF-8,这样在显示的时候就有可能乱码。另外:MT的TRACKBACK中也有类似问题。
因此需要进行一些字符集的检测和转换过程。近期我打算参照在AWStats中做的UTF-8自动检测改进对referer.js做一些改造。
总体来说:referrers系统 1.0由于记录是基于CGI对文本的操作的,总体效率不是很高,但是配置简单,很适合小访问量的个人站点使用,包括很多BLOG系统本身,都是非常小巧,适合个人构建,这样很多服务和内容就不会因为个别服务商网站的倒掉对内容,也就是互联网所提倡的所谓的“分权”和“无中心化”(Decentralization)吧
注释:
HTTP标准中的referer的确是一个笔误:少了一个'r',应该是referrer,但用的时间长了,也就成了标准。
后记:
6E完成了一个修正后的版本,并提供了服务。
版权声明:可以转载,转载时请务必以超链接形式标明文章 Stephen的referrer统计系统使用和改进:如何对来自百度的来源进行统计 的原始出处和作者信息及本版权声明。
http://www.chedong.com/blog/archives/000284.html
Comments
你的办法确实好用!
如果用百度搜索“3721 车东”,这个referrer不知道会算到谁的头上,^_^
由: Hilton 发表于 2004年03月25日 下午01时18分
根据先后顺序,这个结果应该是3721。
最好匹配完整一些,例如:
if ($in =~ /seek.3721.com/g) 就不会出现匹配多次成功。
由: Liang 发表于 2004年03月31日 夜间05时01分
参照了在AWStats中做的UTF-8自动检测和hedong的帮助,我把字符集问题解决了,谢谢你的文章的启发
http://www.5ilinux.com/blog/archives/000135.html
由: frank 发表于 2004年04月02日 夜间12时16分
基本思想是这样的,就是做两套的refer系统,一个专门显示gb2312,另外一个专门显示utf-8
在utf-8的系统里,所有的title都经过 gb --> utf-8 的转换,当然gb 转换会有正确的结果,但是utf-8 本身是3字节code,因此转换成2字节的gb2312会有 exception,可以catch exception,就知道它本身就是 utf-8 了。
简单增加了3行程序:
$dtittmp = $dtit ;
$dtit = $converter->convert($dtit);
unless ($dtit) { $dtit = $dtittmp; }
改过以后的程序:
http://luliang.dhs.org/luliang/download/chinese/referrers.txt
由: Liang 发表于 2004年04月13日 夜间05时39分
我也做了一个refer,感觉不错
http://www.douzhe.com/
能找到baidu,3721,psearch.163.com.........
由: 南非蜘蛛 发表于 2004年07月03日 夜间03时25分
我也做了一个反向链接(Referrers)系统,用ASP+Access做的,而且是开源的。
请访问我的Blog:http://blog.csdn.net/caviler/
由: 一无所知 发表于 2005年01月12日 夜间12时04分