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 简单抽屉效果的实现代码
Mar 09 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
May 23 Javascript
面向对象设计模式的核心法则
Nov 10 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 Javascript
js编写简单的计时器功能
Jul 15 Javascript
Element Rate 评分的使用方法
Jul 27 Javascript
jquery轮播图插件使用方法详解
Jul 31 jQuery
ES2020让代码更优美的运算符 (?.) (??)
Jan 04 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实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php文件系统处理方法小结
2016/05/23 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python flask中动态URL规则详解
2019/11/22 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
数据库方面面试题
2012/04/22 面试题
中学教师岗位职责
2013/11/26 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
邹越演讲观后感
2015/06/15 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python