referer丢失问题的小结--web analytics系列

时间:2021-07-02 15:12:09

referrer丢失的几个场景总结:

1.使用window.location进行页面跳转

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

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

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

 PS:在使用 window.location时的一个解决方案,把使用window.location.href= "example.com"的地方换成replace_location("example.com"

function replace_location(url){
var isIe=(document.all)?true:false;
if(isIe) {
var linka = document.createElement(’a');
linka.href=url;
document.body.appendChild(linka);
linka.click();
}else {
window.location = url;
}

} 

 

2.使用window.open打开新页面

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

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

javascript:alert(document.referrer)

测试结果:  会导致在IE下丢失Referrer。

PS:如果是同个域名下通过此方式跳转的,那么我们可以通过访问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>

跨域的话会报没有权限的错误

PS:什么情况下算是JS跨域

URL 说明 是否允许通信
http://www.kuqin.com/lab/a.js
http://www.kuqin.com/script/b.js
同一域名下不同文件夹 允许
http://www.kuqin.com/a.js
http://www.kuqin.com/b.js
同一域名下 允许
http://www.kuqin.com:8000/a.js
http://www.kuqin.com/b.js
同一域名,不同端口 不允许
http://www.kuqin.com/a.js
https://www.kuqin.com/b.js
同一域名,不同协议 不允许
http://www.kuqin.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 不允许
http://www.kuqin.com/a.js
http://script.kuqin.com/b.js
主域相同,子域不同 不允许
http://www.ithao123.com/a.js
http://www.kuqin.com/b.js
不同域名 不允许

 

3. 鼠标拖拽打开新窗口,所有浏览器都丢失

4. 点击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的值都是来源网页的地址。 

  

5.HTTPS跳转到HTTP,所有浏览器都丢失