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中sort()方法的用法
Nov 04 Javascript
几个javascript操作word的参考代码
Oct 26 Javascript
js 学习笔记(三)
Dec 29 Javascript
jQuery常见开发技巧详细整理
Jan 02 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
js获取地址栏中传递的参数(两种方法)
Feb 08 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
jquery实现图片轮播器
May 23 jQuery
详解vue项目首页加载速度优化
Oct 18 Javascript
JS为什么说async/await是generator的语法糖详解
Jul 11 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 Javascript
在vue中使用jsx语法的使用方法
Sep 30 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 中文和编码判断代码
2010/05/16 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
Python导入oracle数据的方法
2015/07/10 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
Python中安装easy_install的方法
2018/11/18 Python
python 实现UTC时间加减的方法
2018/12/31 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
python实现图片上添加图片
2019/11/26 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
体育教育个人自荐信范文
2013/12/01 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
小学生暑假家长评语
2014/04/17 职场文书
大学生年度个人总结
2015/02/15 职场文书
新闻稿怎么写
2015/07/18 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript