JavaScript中的document.referrer在各种浏览器测试结果


Posted in Javascript onJuly 18, 2014

前段时间需要通过 JavaScript 获取页面的来源,这个操作很简单,使用 document.referrer 就可以获取到了。不过,实际应用中还是有很多意外情况,这儿简单整理一下。

首先遇到的问题,是从 HTTPS 页面转到 HTTP 页面后,document.referrer 的值为空。出于安全性考虑,很多网站的一些重要页面(比如淘宝的登录页面)都会使用 HTTPS 协议。如果某个未登录用户在页面 A(HTTP 页面)点击了页面 B(HTTP 页面)的链接,但页面 B 需要用户登录,于是先跳到登录页面 (HTTPS 页面),登录完成之后再跳回 B(HTTP 页面),这时你会发现 B 页面上取不到 document.referrer 了。也就是说,如果想根据 referrer 来还原用户访问路径的话,如果路径中有 HTTP 页面也有 HTTPS 页面,那么这个路径就会在从 HTTPS 到 HTTP 的地方断掉。

这个问题的根源是浏览器的安全策略,只靠 JavaScript 似乎没有特别好的解决办法。一个迂回的思路是使用 window.name,在 HTTPS 页面将当前页面的 url 写到 window.name 中,再在下一个页面(HTTP 页面)读取。

除了这种情况,其它页面跳转是否都能正常取到 document.referrer 呢?我搜索了一番,发现 这儿 有人整理了一个列表,不过不是很全,例如没有包括垂而不死的 IE6 的情况。于是便自己动手,在虚拟机里装了 N 个浏览器,把各种情况都测试了一下(这真是一个体力活),结果见下表:

操作 IE6 IE7 IE8 IE9 Firefox Chrome Opera Safari
直接在地址栏输入URL “” “” “” “” “” “” “” “”
从书签访问URL “” “” “” “” “” “” “” “”
从页面A点击超链接,跳转到页面B(target=”_self”)
从页面A点击超链接,跳转到页面B(target=”_blank”)
从页面A右键单击超链接,在新标签页中打开页面B - “”
从页面A右键单击超链接,在新窗口中打开页面B “”
拖动链接到地址栏 “” 无法拖动 无法拖动 “” “” “” “” “”
拖动链接到标签栏 - “” “” “” “” “” “” “”
使用浏览器的前进、后退按钮
JS 修改 location.href “” “” “”
JS 使用 window.open “” “” “” “”
服务器重定向(302跳转) 定向之前的页面 定向之前的页面 定向之前的页面 定向之前的页面 定向之前的页面 定向之前的页面 定向之前的页面 定向之前的页面
页面 Meta Refresh “” “” “” “” “” 转向页 转向页 转向页

上表中的“√”表示能正常取到 referrer,”” 表示 referrer 为空。

除了 IE 外,其它浏览器都是目前官网上能下载到的最新版本,其中 Safari 同时测试了 Windows 版和 Mac 版,结论一样。

另外还有一些情况未做测试,例如点击 Flash 跳转时各浏览器下能否保持 referrer 等。

上表中大部分情况是符合预期的,不过似乎也有几处需要注意的:

1、在 Safari 中,右键打开链接会丢失 referrer;
2、在 IE 中,修改 location.href 或使用 window.open 打开页面会丢失 referrer(IE 9 有一点例外,使用 location.href 跳转不会丢失 referrer);
3、使用 meta 跳转时,IE / Firefox 下会丢失 referrer。

最后,一个简单的结论是:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。

Javascript 相关文章推荐
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
js实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
Feb 23 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
jquery的map与get方法详解
Nov 04 Javascript
jQuery检测鼠标左键和右键点击的方法
Mar 17 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 #Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
Jul 18 #Javascript
JQuery对表单元素的基本操作使用总结
Jul 18 #Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 #Javascript
jQuery中attr()和prop()在修改checked属性时的区别
Jul 18 #Javascript
$.each遍历对象、数组的属性值并进行处理
Jul 18 #Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
Jul 17 #Javascript
You might like
用PHP编写PDF文档生成器
2006/10/09 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
关于this和self的使用说明
2010/08/01 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
JavaScript类的写法
2016/09/17 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
vue实现弹幕功能
2019/10/25 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
python中使用%与.format格式化文本方法解析
2017/12/27 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
django admin 添加自定义链接方式
2020/03/11 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
学期评语大全
2014/04/30 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
颐和园导游词
2015/01/30 职场文书
养成教育主题班会
2015/08/13 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
Mysql Show Profile
2021/04/05 MySQL
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS