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 相关文章推荐
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
js实现无限级树形导航列表效果代码
Sep 23 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
May 22 Javascript
vue.js实现插入数值与表达式的方法分析
Jul 06 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
8个JS的reduce使用实例和reduce操作方式
Oct 05 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
自动跳转中英文页面
2006/10/09 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
数组Array的排序sort方法
2017/02/17 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python温度转换实例分析
2018/01/17 Python
Python中collections模块的基本使用教程
2018/12/07 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
类的核心特性有哪些
2014/01/01 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
关于人生的感言
2014/01/17 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server
mysql 排序失效
2022/05/20 MySQL