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中显示隐藏的实现代码分析
Jul 26 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
Jun 25 Javascript
地址栏传递中文参数乱码在js里用escape转码
Aug 28 Javascript
自己用jQuery写了一个图片的马赛克消失效果
May 04 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
简述AngularJS相关的一些编程思想
Jun 23 Javascript
高性能JavaScript循环语句和条件语句
Jan 20 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
在vue中使用vue-echarts-v3的实例代码
Sep 13 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
微信小程序进入广告实现代码实例
Sep 19 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 PDO中文乱码解决办法
2009/07/20 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
js window.event对象详尽解析
2009/02/17 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
常用的javascript设计模式
2017/01/11 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python3生成手写体数字方法
2018/01/30 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
Java的for语句中break, continue和return的区别
2013/12/19 面试题
招商经理岗位职责
2013/11/16 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
周一给客户的问候语
2015/11/10 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android