referrer丢失的几个场景总结:

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

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

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

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

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="#" οnclick="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.jshttp://www.kuqin.com/script/b.js

同一域名下不同文件夹

允许

http://www.kuqin.com/a.jshttp://www.kuqin.com/b.js

同一域名下

允许

http://www.kuqin.com:8000/a.jshttp://www.kuqin.com/b.js

同一域名,不同端口

不允许

http://www.kuqin.com/a.jshttps://www.kuqin.com/b.js

同一域名,不同协议

不允许

http://www.kuqin.com/a.jshttp://70.32.92.74/b.js

域名和域名对应ip

不允许

http://www.kuqin.com/a.jshttp://script.kuqin.com/b.js

主域相同,子域不同

不允许

http://www.ithao123.com/a.jshttp://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,所有浏览器都丢失