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 相关文章推荐
JS构建页面的DOM节点结构的实现代码
Dec 09 Javascript
js中onload与onunload的使用示例
Aug 25 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
javascript兼容性(实例讲解)
Aug 15 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
使用 UniApp 实现小程序的微信登录功能
Jun 09 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
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
几种tab切换详解
2017/02/03 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python中字符串的操作方法大全
2018/06/03 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
python pymysql库的常用操作
2020/10/16 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
python3判断IP地址的方法
2021/03/04 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
网上开店必备创业计划书
2014/01/26 职场文书
欢迎领导检查标语
2014/06/27 职场文书
擅自离岗检讨书
2014/09/12 职场文书
公司员工安全协议书
2014/11/21 职场文书
小学体育教学随笔
2015/08/14 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
python tkinter模块的简单使用
2021/04/07 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB