很多用户跟踪分析程序使用document.referrer来获取此页面的来路,比如ga、百度统计,通过referrer可以获得搜索关键词等。有的时候,我们的网页上有一个链向别的网站的连接,但是不想让被链接网站知道是从我们的页面上过来的,这时候就需要是浏览器不发送referrer。

一般都是用

<meta http-equiv="refresh" content="0;URL=someurl"/>

来屏蔽,但是chrome还是会发送,所以还要想办法处理一下。

今天在 http://www.zhe800.com/发现跳转连接有一串很长的”data:text/html;charset=utf-8”,感觉很奇怪,于是研究了一下,确实可以屏蔽referrer,而且对任何浏览器都有效。

比如,在一个跳转页面中:http://out.zhe800.com/ju/fan/jingjulian_85469?page_stats_w=index/3*1,点击“不要积分,悲催的前往”,然后用fiddler观察一下,发现确实没有发送referrer。核心代码在http://z0.tuanimg.com/v1/jifen/welfare/js/ddloginpi1.5.min.js中,zhe800用jquery实现的,但是为了简化,完全可以写成:

function gotourl(url){
            var html = "<html><head><meta http-equiv='Refresh' content='0; URL=" + url + "' /></head><body></body></html>";
   var a=document.createElement("a");
   a.onclick= function() {
                if (navigator.userAgent.toLowerCase().indexOf("msie")>-1) {
                    document.write(html);
                    document.execCommand("Refresh")
                } else {
                    window.location =  "data:text/html;charset=utf-8," + (encodeURIComponent(html));
                }
            };
   document.body.appendChild(a);
   a.click();
}

这样就没有了任何依赖。对于支持data:的非ie浏览器,创建了一个临时页面,这个临时页面也是通过meta跳转的,chrome发送的时候,发送的是这个临时页面的地址,为空,所以就避开了。

# 测试

注:以上结果在下列浏览器测试成功,而且gotourl现在只能是以http://开头的绝对路径。

  1. Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36
  2. Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:23.0) Gecko/20100101 Firefox/23.0
  3. Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)

# 关于referrer的拼写问题

查看浏览器发送的头部信息,用的是Referer: http://xxxx/yy。然后在js中只有document.referrer变量。中间有个”r”。到底是怎么拼写的? 详情见:http://english.stackexchange.com/questions/42630/referer-or-referrer