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 解析多维的Json数据格式
Nov 02 Javascript
QUnit jQuery的TDD框架
Nov 04 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
显示今天的日期js代码(阳历和农历)
Sep 30 Javascript
Jquery中Event对象属性小结
Feb 27 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
Oct 25 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
Dec 20 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
vue-router 手势滑动触发返回功能
Sep 30 Javascript
vue实现日历备忘录功能
Sep 24 Javascript
微信小程序开发技巧汇总
Jul 15 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 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和ACCESS写聊天室(二)
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
python实现简单flappy bird
2018/12/24 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
专科应届生求职信
2013/11/24 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
初婚未育证明样本
2015/06/18 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS