referer丢失问题的小结--web analytics系列
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")
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,所有浏览器都丢失