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 对象、函数和继承
Jul 07 Javascript
js判断变量初始化的三种形式及推荐用的形式
Jul 22 Javascript
JS判断页面是否出现滚动条的方法
Jul 17 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
js仿腾讯QQ的web登陆界面
Aug 19 Javascript
js实现简单的碰壁反弹效果
Aug 30 Javascript
react中使用swiper的具体方法
May 15 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 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 自定义错误处理函数的使用详解
2013/05/10 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP序列化操作方法分析
2016/09/28 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
大学生军训广播稿
2014/01/24 职场文书
购房协议书范本
2014/04/11 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
2014年财务部工作总结
2014/11/11 职场文书
岳麓书院导游词
2015/02/03 职场文书
讨论nginx location 顺序问题
2022/05/30 Servers