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域名,其他部分不变:

1

window.location.hostname = "example.com";

但是,通过修改Location进行页面导航的方法,会导致在IE下丢失Referrer。

IE5.5+ 下返回空字符串

Chrome3.0+,Firefox3.5,Opera9.6,Safari3.2.2均正常返回来源网页

window.open方式打开新窗口

示例:

1

<a href="#" onclick="window.open('http://www.google.com')">访问Google</a>

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

1

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呢?

  • 使用新增的html5的解决方案,使用rel="noreferrer",声明连接的属性为noreferrer,目前只有chrome4+支持.
  • 使用中间页面,但实际上还是发送referrer的,比如使用Google的连接转向,noreferrer.js.
  • 使用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);

}

原文:Ruby's Louvre 的 javascript操作referer

页面跳转javascript操作referer相关推荐

  1. swal如何加入html语言,Sweet Alert弹窗点击确定后执行页面跳转等操作

    可不可以点击 Sweet Alert 弹窗的确定按钮后跳转页面呢?答案是可以的: 首先参考上文,引入 Sweet Alert 所需的文件,我这里写了一个修改密码的确认框. 点及修改后,会弹出修改成功提 ...

  2. js实现前端页面跳转后操作新页面

    最近开发的时候遇到了一个需求,需要跳转到一个新页面后,程序自动控制新页面滚动到相应位置.实质上就是一个如何通过本页面的js触发其他页面的事件,这样一个问题. 网上找了一圈,并没有找到操作新页面的办法( ...

  3. JS返回上一页-JS返回下一页-JS页面跳转

    JS返回上一页-JS返回下一页-JS页面跳转 Javascript 返回上一页: 1. history.go(-1), 返回两个页面: history.go(-2); 2. history.back( ...

  4. 微信小程序系列3——页面跳转详解

    前言   首先,微信页面跳转的是一个页面栈进栈出栈的过程,也可以简单的理解对页面跳转的操作就是一个栈的操作. 微信小程序主要一下两类样式的跳转(JS.WXML控件): JS控制的跳转: navigat ...

  5. swift 原生给h5发消息_Swift-WKWebView与JavaScript的细节,H5页面跳转原生界面

    大家(也包括我)要学会 明白一件事情(注意断句,哈哈).优秀的程序猿会将问题简单化. 世界上有10种人,一种是先把问题复杂化,然后在一点点的做减法:另一种是先把问题简单化,然后在慢慢的做加法:(好了该 ...

  6. php等待参数跳转,Thinkphp页面跳转设置跳转等待时间的操作

    在 thinkphp 3.2.3 中,在目录 ThinkPHP\Library\Think 找到 Controller.class.php 这个文件,在代码里面找到 dispatchJump 这个方法 ...

  7. javascript传值和页面跳转传值(ASP.NET页面传参的三种方法)

    我在csdn上提的问题是        我现在希望从asp.net网页弹出对话框,弹出一些错误信息.警告.提示信息之类的东西,目前准备用javascript实现,所以我希望在调这个对话框的时候,动态传 ...

  8. 怎么不让html网页自动跳转,javascript怎么禁止跳转页面?

    JavaScript中可以通过在点击跳转页面时调用preventDefault()方法来禁止页面跳转.preventDefault()方法可以取消事件的默认动作. 如果在点击时候调用preventDe ...

  9. vue中页面跳转传值_vue跳转方式(打开新页面)及传参操作示例

    本文实例讲述了vue跳转方式(打开新页面)及传参操作.分享给大家供大家参考,具体如下: 1. router-link跳转 // 直接写上跳转的地址 link跳转 // 添加参数 // 参数获取 id ...

最新文章

  1. Cocos2d-x:使用九宫格(九切片)自定义缩放资源
  2. ux设计中的各种地图_UX写作中的移情
  3. [NewLife.XCode]脏数据
  4. NX(UGS)技术关于我和你顶着忽移不定的云彩
  5. RocketMq 事务消息使用
  6. 几行Python代码生成饭店营业额模拟数据并保存为CSV文件
  7. linux自定义model,关于modelarts自定义镜像使用心得
  8. Hadoop阅读笔记(一)——强大的MapReduce
  9. 二进制转十进制 十进制转二进制
  10. java使用smartupload组件实现文件上传的方法
  11. 《Adobe After Effects CS5经典教程》——1.6 预览
  12. 汉字乱码的终极解决方案
  13. python - TXT章节文转为epub和mobi格式
  14. oracle cube语法,oracle Rollup 和 Cube用法
  15. 用c语言写抽奖大转盘,iOS抽奖大转盘的二种实现方法
  16. 男生哪个瞬间让你心疼?
  17. 小米路由器安装mysql_小米路由器安装和设置方法(图文教程)
  18. Node rar压缩/解压文件
  19. glusterfs搭建
  20. 单片机学习 9-直流电机实验

热门文章

  1. SQLALCHEMY_TRACK_MODIFICATIONS adds significant异常的解决方法
  2. 如何使用ArcGIS从天地图中提取水系
  3. 简单python项目实例-python实战项目
  4. 五分钟读懂经济学十大原理
  5. 【BZOJ4545】DQS的trie
  6. oc和java的优点缺点_oc语言的优点和缺点
  7. python毕业设计作品基于django框架 图片分享平台毕设成品(6)开题答辩PPT
  8. stm32简单小实例_煽动MCU/MPU市场,STM32的生态图
  9. python车牌识别系统+车辆管理+计费系统(图像识别)django框架 计算机毕业设计
  10. VNC安装常见问题与处理