东拉西扯

闲来无事,分析下百度是如何实现取消referer关键词显示的

Jager · 9月19日 · 2015年 1440次已读

还是在今年 6 月底,百度就放出全面取消 referer 关键词显示的通知,听说目的是为了保护用户隐私和站点流量关键词数据。

闲来无事,分析下百度是如何实现取消referer关键词显示的具体公告如下:

各位亲爱的网站管理员:

百度已实现全站 https 化,在 BAT 中率先完成全站加密,以推动网络环境安全。为了进一步保护用户隐私,防止第三方窃听和篡改,百度已于 6 月 25 日正式取消 referer 中关于关键词的显示,更好的保护站点流量关键词数据信息,令站点数据更加私密化。站长需要获得网站流量关键词时,仍然可以使用百度站长平台提供的流量与关键词工具或者百度统计相关功能进行查询。

然而并没有什么 L 用,本来就不知道谁在百度搜索了什么见不得人的事情,隐藏关键词那不是脱了裤子放屁么?

另外,保护站点流量关键词数据,这一点我倒是觉得很有用,省的某些人总是去瞄瞄谁谁谁的站点的哪篇文章有个很牛逼的关键词,然后吧唧就复制粘贴了。不过,这个做法还是无法完全杜绝,为啥?因为你百度还有一个百度指数的功能!别人拿到高指数的词一搜就知道那个谁谁谁的文章排第一了?不过只是增加了麻烦的程度而已!

说个不好意思的事情,这公告刚出来的时候,我其实是没看懂是什么意思的。。。去认为从一个页面的链接点击后跳到另一个页面难道不会产生 referer?这不科学啊!然后我就没在意了。。。

直到前不久,偶然发现张戈博客原创作品【搜索来路欢迎框】不提示关键词了:

闲来无事,分析下百度是如何实现取消referer关键词显示的

本以为是我代码 BUG 了,于是亲自输出了一下 referer 看了下,发现我写的代码还是可以拿到 referer,可惜 referer 里面的关键词 wd 的值是空的,比如:

https://www.baidu.com/link?url=dEvj7DE-rHNYgoNrzCSrgBLAVrWns06Ub1h8DjGa5mv-gSonnZp9VCYaDBKRmvDV&wd=&eqid=c1a3fa880009ab000000000555fce97f

这时候又勾起了我的兴趣,了解 referer 的朋友都知道,当我们点击 A 页面中的链接跳转到 B 页面时,B 页面里面 referer 值就是 A 页面地址。

也就是说,我在百度搜索张戈博客,那么页面地址应该是:

https://www.baidu.com/s?wd=张戈博客

即 A 页面地址,如果我们从这个搜索结果中点开第一个链接来到张戈博客,那么产生的 referer 应该就是上面这个搜索地址才对!百度是如何做到隐藏这个关键词的呢??

前几天,在写一个爬虫脚本的时候,破天荒的试了下百度搜索结果中的链接,终于搞懂了这其中的奥妙之处,感觉挺有意思,所以就把其他原创干货继续压在草稿箱等发霉,先把这个发现分享下。

就以张戈博客这个关键词搜索出来的地址为例吧!百度搜索张戈博客后的结果如下图所示:

闲来无事,分析下百度是如何实现取消referer关键词显示的

接着,我试着在 Linux 下使用 curl 请求,发现如下图所示:

闲来无事,分析下百度是如何实现取消referer关键词显示的

把结果格式化了下:

<meta content="always" name="referrer">
<script>try {
    if (window.opener && window.opener.bds && window.opener.bds.pdc && window.opener.bds.pdc.sendLinkLog) {
        window.opener.bds.pdc.sendLinkLog();
    }
} catch(e) {};
var timeout = 0;
if (/bdlksmp/.test(window.location.href)) {
    var reg = /bdlksmp=([^=&]+)/,
    matches = window.location.href.match(reg);
    timeout = matches[1] ? matches[1] : 0
};
setTimeout(function() {
    window.location.replace("https://zhang.ge/")
},
timeout);</script>
<noscript><META http-equiv="refresh" content="0;URL='https://zhang.ge/'"></noscript>

然后我就明白了百度是如何做到隐藏关键词的了。

比较简单,但很巧妙的做法:百度现在的搜索结果链接不再直接跳转到目标页面,而是通过了一个隐藏的中转页面。以上代码的大概功能就是,如果浏览器支持 Javascript,那么将通过其中的 js 函数跳转到目标页面,如果浏览器不支持 Javascript,那么也能通过最后的 META 标签让浏览器实现跳转。

由于有了这个中间页面,那么关键词也就断章了,因为真正有关键词的 referer 只能在中间页面这取得,目标页面取得的 referer 则是中间页面的地址,是没有关键词的!

百度还真是用心良苦啊!...

还好我写的【搜索来路欢迎框】是兼容空关键词的,否则显示的就是 null 了。

既然知道有这么个巧妙的做法,那我们在某些场景是否可以借鉴一下呢?我想肯定是用得到的,只是你没遇到而已。。。比如,你的某页面偷偷链接了某站的地址,又不想让站长知道?不过这也是够无聊的了,哈哈哈!

12 条回应
  1. 大漩涡 2015-9-19 · 15:39

    好像没有神马卵用啊

  2. 南国掌柜博客 2015-9-19 · 20:37

    连我这种小白都看懂了...

  3. 瑾瑜 2015-9-20 · 10:11

    张哥还是那么爱钻研~

  4. 香港虚拟主机 2015-9-21 · 14:27

    百度实现取消referer关键词显示,原来是这样实现的,自从百度取消referer关键词显示,感觉第三方都没啥作用了

  5. 微商 2015-9-22 · 21:42

    一如既往的牛逼

  6. 拉卡拉 2015-10-20 · 2:03

    百度实现取消referer关键词显示,原来是这样实现的,自从百度取消referer关键词显示,学习了

  7. 邢台网站建设 2016-1-10 · 17:32

    看了这个文章,楼主的解释,感觉很有价值,请问下Jager大神,noscript中的那种跳转,如果弄到站内首页做功能跳转用的话,百度或者其他搜索引擎会不会认为不好等问题?如果不会这么判定,我就把自己的站里加个单独的说明页面去,介绍如何开启script的方法,感觉很实用,不过一般也用不到这个页面,不过本着折腾的想法,还是想讨教下是否会判定不好?

  8. junze 2016-3-18 · 16:04

    很不错的分享

  9. 小C博客 2016-3-23 · 22:23

    这都被你研究出来了!!6666

  10. zz618 2016-5-3 · 15:54

    现在是不是无法获取了,大神

  11. 本质游戏 2016-8-3 · 22:16

    对于我想刷真实流量,如何伪造中间页呢?

    • 菠萝 2021-10-25 · 17:17

      无法伪造,因为百度证书是CA认证的,请求和返回内容无法篡改,除非访问的是钓鱼百度网站“https://www.baodu.com/s?wd=张戈博客”