Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  javascript  >  正文 javascript操作referer方法探讨

javascript操作referer方法探讨

发布时间:2015-06-10   编辑:www.jquerycn.cn
本文介绍了javascript操作referer的方法,有关js操作referer头信息的方法,有需要的朋友参考下。

介绍正式内容前,先说说referrer的重要性。
http请求中有一个referer的报文头,用来指明当前流量的来源参考页。

例如在www.sina.com.cn/sports/上点击一个链接到达cctv.com首页,那么就referrer就是www.sina.com.cn/sports/了。在javascript中,我们可以通过document.referrer来获取同样的信息。通过这个信息,我们就可以知道访客是从什么渠道来到当前页面的。

这对于web analytics来说,是非常重要的,这可以告诉我们不同渠道带来的流量的分布情况,还有用户搜索的关键词等,都是通过分析这个referrer信息来获取的。

但是,出于各种各样的原因,有时候javascript中读到的referrer却是空字符串。下面总结一下哪些情况下会丢失referrer。
修改location对象进行页面导航

location对象是一个用于页面导航的非常实用的对象。因为他允许你只变更url的其中一部分。
例如从cn域名切换到com域名,其他部分不变:
 

复制代码 代码示例:
window.location.hostname = "example.com";

但是,通过修改location进行页面导航的方法,会导致在ie下丢失referrer。
ie5.5+ 下返回空字符串
chrome3.0+,firefox3.5,opera9.6,safari3.2.2均正常返回来源网页
window.open方式打开新窗口

例子:
 

复制代码 代码示例:
<a href="#" onclick="window.open('http://www.google.com')">访问google</a>

点击此链接会在新窗口打开google网站,在地址栏中输入以下js代码即可看到发送的referrer了。
 

复制代码 代码示例:
javascript:alert(document.referrer)

测试结果:
ie5.5+ 下返回空字符串
chrome3.0+,firefox3.5,opera9.6,safari3.2.2均正常返回来源网页
如果是同个域名下通过此方式跳转的,那么我们可以通过访问windoww.opener对象去获取丢失的referrer信息。

例子:
 

复制代码 代码示例:
<script type="text/javascript">
    var referrer = document.referrer;
    if (!referrer) {
        try {
            if (window.opener) {
                // ie下如果跨域则抛出权限异常
                // safari和chrome下window.opener.location没有任何属性
                referrer = window.opener.location.href;
            }
        } 
        catch (e) {}
    }
</script>

跨域的话则没辙了~
鼠标拖拽打开新窗口
鼠标拖拽是现在非常流行的用户习惯,很多浏览器都内置或者可以通过插件的方式来支持鼠标拖拽式浏览。
但是通过这种方式打开的页面,基本全都丢失referrer。
这种情况下,也无法使用window.opener的方式去获取丢失的referrer了。
已测试:
maxthon2.5.2,firefox的firegesture插件,chrome3.0+,opera9.6,safari3.2。
点击flash内部链接
点击flash上到达另外一个网站时,referrer的情况就比较杂乱了。
ie下,通过客户端javascript的document.referrer读取到的值是空的,但是如果你使用流量监控软件看一下的话,你会发现,实际上http请求中的referer报文头却是有值的,这可能是ie实现的bug。同时,这个值指向的是flash文件的地址,而不是来源网页的地址。
chrome4.0下点击flash到达新窗口之后,referrer也是指向的flash文件的地址,而不是源网页的地址。
chrome3.0和safari3.2是一样的,都是会丢失referrer信息。
opera则和firefox一样,referrer的值都是来源网页的地址。

https跳转到http
从https的网站跳转到http的网站时,浏览器是不会发送referrer的。这个各大浏览器的行为是一样的。
例如,我们在https下使用google reader或是gmail时,点击某个链接去到另外一个网站,那么从技术上来说,这样的访问和用户直接键入网址访问是没有什么分别的。
referrer丢失对于广告流量监控的影响。

referrer如果丢失,web analytics就会丢掉很重要的一部分信息了,特别对于广告流量来说,就无法知道实际来源了。目前国内好多用了google adsense广告的网站,都使用了window.open的方式来打开广告链接,因此ie下会丢失referrer,而我们知道,ie是目前市场份额最大的浏览器,因此其影响是很大的。很多流量统计工具会因此将这部分流量归入“直接流量”,和用户直接键入网址等价了。

对于这样的情况,需要让广告投放者在投放广告时,给着陆页面的url加上特定的跟踪参数。
例如,某个flash广告,点击之后到达的网址是http://www.example.com/,为了监控此流量是从哪个渠道过来的,我们可以修改此投放的着陆url,改成http://www.example.com/?src=sina,类似这种方式,然后在着陆页面中使用javascript代码提取此src参数,这样就可以得到广告来源信息。
在投放google adwords时,后台系统有一个“自动标记”的选项,当启用此选项时,google在生成所有广告的着陆页面url时,就会自动加上一个gclid的参数,这个参数能够将google analytics后台和adwords广告后台的数据进行整合。这样就可以知道广告流量对应于哪个广告系列,哪个广告来源和广告关键词等信息了。和上面提到的思路其实是类似的。只不过google自动帮你做了url的修改了而已。

ie下referer为空的解决办法
在ie下采用 window.location.href方式跳转的话,referer值为空。而在标签里面的跳转的话 referer就不会空。
所以,通过以下代码解决这个ie问题。
 

复制代码 代码示例:
function gotourl(url){
     if(window.vbarray){
         var gotolink = document.createelement('a');
         gotolink .href = url;
         document.body.appendchild(gotolink);
         gotolink .click();
     }else{
       window.location.href = url;
     }
 }

禁止浏览器在访问链接时不要带上referer
我们在从一个网站点击链接进入另一个页面时,浏览器会在header里加上referer值,来标识这次访问的来源页面。但是这种标识有可能会泄漏用户的隐私,有时候我不想让其他人知道我是从哪里点击进来的,能否有手段可以让浏览器不要发送referer呢?
1,使用新增的html5的解决方案,使用rel="noreferrer",声明连接的属性为noreferrer,目前只有chrome4+支持.
2,使用中间页面,但实际上还是发送referrer的,比如使用google的连接转向,noreferrer.js.
3,使用javascript协议链接中转,参见下面的说明.
新开一个窗口,相当于target="_blank":
 

复制代码 代码示例:
function open_window(link){ 
    var arg = '\u003cscript\u003elocation.replace("'+link+'")\u003c/script\u003e';
    window.open('javascript:window.name;', arg);
}
 

转向到一个连接,相当于target="_self":
 

复制代码 代码示例:
function redirect(link){ 
    var arg ='\u003cscript\u003etop.location.replace("'+link+'")\u003c/script\u003e';
    var iframe = document.createelement('iframe');
    iframe.src='javascript:window.name;';
    iframe.name=arg;
    document.body.appendchild(iframe);
}

您可能感兴趣的文章:
javascript操作referer方法探讨
根据来路是否为搜索引擎来决定是否跳出弹窗代码
php伪造来源HTTP_REFERER的实例探讨
php伪造referer 使用referer防止图片盗链
js数组转化为字符串示例
Javascript 返回上一页并刷新的多种方法
python怎么做反爬
探讨:PHP获取域名及域名IP地址的方法
.net中何有效的使用Cache
探讨 Jquery ready和Dom onload的区别

关键词: referer   
[关闭]