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 EasyUI API 中文文档 - TimeSpinner时间微调器
Oct 23 Javascript
Js+Flash实现访问剪切板操作
Nov 20 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 Javascript
浅析jquery的作用与优势
Dec 02 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
JS函数的定义与调用方法推荐
May 12 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
javascript操作数组详解
2014/12/17 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
Python中List.count()方法的使用教程
2015/05/20 Python
Python可变参数用法实例分析
2017/04/02 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python如何修改装饰器中参数
2018/03/20 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
艾滋病宣传活动总结
2014/05/08 职场文书
分公司经理任命书
2014/06/05 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python