今天爬到了一个blog 关于站点探测的问题,今天闹了一个笑话。上面提到了"经常从GOOGLE里搜到一些论坛的隐藏论坛里面的文章,而这些论坛至少游客是无法访问的,一般的论坛都使用SESSION或者COOKIE来做限制,不知道用这次讨论的原理该怎么解释"。其实正像作者猜测的,就是故意而为,即所谓的Cloaking技术。
Cloaking技术被一些人认为是SEO SPAM的一种,但我个人觉得就像传销、小姐、央视专家等词一样,Cloaking只不过是一个被用烂的中性词。举例来说,用中文IE访问Google首页,你看到的是简体中文版的Google(前提是没作任何个性化设置),但用英文版Firefox访问Google首页,你看到的是英文版Google。这其实就是Cloaking的正面例子。类似的例子还有中国IP的用户访问www.yahoo.com会看到左上方有Y!China的图标连接。
所谓搜索引擎Cloaking,也就是给不同的索搜引擎爬虫准备不同版本的页面。因为搜索引擎爬虫的名字是作为User Agent发送给服务器的,即在服务器眼里,无论IE\Firefox\FlashGet还是Googlebot(还有Alexa Toolbar-不想提它),都是一个浏览器,只不过这些浏览器背后的用户可能是活人,可能是机器,还可能是装成机器的活人(Alexa 作弊者),也可能是装成活人的机器(抓Cloaking作弊的搜索引擎爬虫),晕么?
下面从纯技术角度演示如何针对User Agent进行Cloaking。先看几行LOG,是我从某Apache LOG中挑出来有代表性的几个(某些地方加了马赛克):
- ###.9.97.98 - - [02/Nov/2005:06:51:14 -0600] "GET /index.html / HTTP/1.1" 200 13961 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
这个是IE 6的用户,后面Mozilla开始是User Agent。
- ###.133.94.71 - - [02/Nov/2005:07:40:35 -0600] "GET /index.html HTTP/1.1" 200 13961 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8) Gecko/20051025 Firefox/1.5"
使用Gecko引擎的Firefox用户
- ###.14.12.120 - - [02/Nov/2005:07:50:24 -0600] "GET /agreement.pdf HTTP/1.0" 200 7133 "-" "FlashGet"
有人用FlashGet下载了agreement.pdf文件
- 66.249.66.41 - - [02/Nov/2005:08:06:57 -0600] "GET /index.html HTTP/1.1" 200 13961 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Googlebot来了
- 64.4.8.121 - - [02/Nov/2005:09:26:24 -0600] "GET /index.html HTTP/1.0" 200 13961 "-" "msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
MSN Bot也来了
- ###.72.108.3 - - [02/Nov/2005:06:47:25 -0600] "GET /index.html HTTP/1.0" 200 13961 "http://www.###.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar; mxie)"
装Alexa Toolbar的用户访问网站后,Alexa又访问一次。
下面是PHP代码针对前4个User Agent的Cloaking:
<? $user_agent = $_SERVER['HTTP_USER_AGENT']; if(strpos($user_agent, 'MSIE 6.0') > -1) { echo "IE 6.0 User. This is a private forum."; /*如果你是Firefox的拥趸,可以在这里显示那个Get Firefox的标志,而不让下面那种已经用了Firefox的人看到 - 因为他们不会点了 - 这有助于你提高转换率 - 又是一个Cloaking的正面例子*/ } else if(strpos($user_agent, 'Firefox') > -1) { echo "Firefox User. This is a private forum."; } else if(strpos($user_agent, 'FlashGet') > -1) { echo "FlashGet User. Do not download my site."; } else if(strpos($user_agent, 'Googlebot') > -1) { echo "Hello Google. Please index this page."; } ?> |
用不同的浏览器访问这个php页面,你会看到不同的结果。注:
- Flashget需要手工修改一下User Agent: 工具->选项->协议,因为默认不是FlashGet。
- 以上代码尽用作演示,从技术角度真正实现应该在服务器端搞,如Apache的.htaccess。因为并不是所有页面都是.php,还有html静态页甚至pdf\zip等
- 即便如此也不应该去Cloaking搜索引擎爬虫,还记得那些装成活人的爬虫么。
下面给论坛的拥有者提示几句:我非常不赞成这种做法。如果你的论坛是公开的,就行该让任何访问者都可以阅读(但没有发帖、跟帖等权限)。有些论坛使用参数很多很长的URL,此时应该准备一个纯文本版用做给搜索引擎索引(别忘屏蔽搜索引擎对参数很长的那个URL的访问)。如果你的论坛属于自己的小圈子,就应该在robots.txt中屏蔽所有user agent,再在论坛程序中设好权限和密码。那些对虫类公开,对人类屏蔽的做法反映了很不好的心态:你是人的话想看我的内容就要注册,你是虫的话就索引我的网站,这样可以带来更多的人 - 当然他们想看还得注册。这样只能导致注册量提高,而实际有意义的成员有多少?况且Google Cache已经能用了。