zoukankan      html  css  js  c++  java
  • 深入理解document.referrer的用法

    前言
    在JavaScript中,document对象有很多属性,其中有3个与对网页的请求有关的属性,它们分别是URL、domain和referrer。
    URL属性包含页面完整的URL,domain属性中只包含页面的域名,而referrer属性中则保存着链接到当前页面的那个页面的URL。
    前面两个很好理解,而referrer属性简单来说就是上一个页面的URL。那么这个属性具体有什么用处呢?
    在H5页面中,我们经常要在头部加个返回上一个页面按钮,就像下面这样的:

     
    image.png

    点击左侧的元素可以返回到上一个页面,我们可以简单写一段JS代码:

    var back = document.getElementById('back'); //假设该返回按钮元素id为back
    back.onclick = function(){
     history.back(); //返回上一个页面,也可以写成history.go(-1)
    };
    // 或者
    <a id="back" href="javascript:history.back();" rel="external nofollow" ></a>
    
    

    咦?上面说了这么多,还是没有说到document.referrer有什么用呀!别急,前面只是铺垫,接下来步入正题~~~
    虽说感觉上面这样已经基本上实现了返回上一页的功能,但是有一种情况没有考虑到(我们程序员还是要严谨一点嘛),就是假如该页面是别人分享过来的而不是通过其他页面进入的呢?那么点击该按钮将不会有任何反应,因为此时history对象中不存在历史记录,也就是说这是你浏览器窗口打开时浏览的第一个页面。
    为了优化用户体验,这里通常有两种解决方案。一种是在打开第一个页面时不显示返回上一页按钮,另一种是点击直接跳转到网站首页,这可以根据产品需求来选择合适的方案。
    这里假设选择第一种方案,我们可以这样写段JS:

    if(document.referrer){
     back.style.display = 'block'; //默认让其隐藏,当referrer属性不为空时让其显示
    }
    //分享页 返回上一页
    if (typeof document.referrer === '') {
     // 没有来源页面信息的时候,改成首页URL地址
     $('.jsBack').attr('href', '/');
    }
    

    其实判断当前页面是否是用户一开始打开的页面,方法也不止通过判断referrer属性这一种方法,还可以通过history.length是否为零来判断。
    浏览器支持情况:

     
    image.png

    关于HTTPS请求
    如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。

    同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。

    但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。
    伪造Referer信息
    根据上文的描述,document.referre源自于Header中的Referer。那么如果想修改document.referre的值,理论上讲,仅需要修改请求Header。可以将Header中现有的Referer替换成自己想要的值,如果原来没有也可以添加Referer。

    在客户端,篡改Header是一件非常容易的事情。在一个页面的http请求发出去之前,可以利用截包工具将其拦截,然后分析出头部信息,并且修改Referre。

    搜了一下,对于FireFox可以使用RefControl插件方便的进行修改。总之,欺骗Traffic source是轻而易举的事情。

    页面强制Refresh

    <meta http-equiv="Refresh" content="5;URL=a.html">
    

    则过5秒后浏览器会自动向server发起a页面请求。

    经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。
    几种意外丢失情况:
    1,直接在浏览器中输入地址
    2,使用location.reload()刷新(location.href或者location.replace()刷新有信息)
    3,在微信对话框中,点击进入微信自身浏览器,
    4,扫码进入微信或QQ的浏览器
    5,直接新窗口打开一个页面
    6,从https的网站直接进入一个http协议的网站(Chrome下亲测),
    7.a标签设置rel="noreferrer"(兼容IE7+)
    8,meta标签来控制不让浏览器发送referer
    9,点击 flash 内部链接
    10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG
    11,跨域
    12,iframe隐藏

    结论:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。
    referrer 的作用:
    1,统计来源,可以统计数量,可以拒绝访问
    2,返回上一页逻辑判断

  • 相关阅读:
    树点涂色
    搜索+DP的一波小水题
    洛谷 P2194 HXY烧情侣
    洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
    走楼梯升级版(9.8 模拟赛。。。xxy原创)
    洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths
    Tyvj P2207 上学路线route
    cogs 2342. [SCOI2007]kshort
    洛谷 P2740 [USACO4.2]草地排水Drainage Ditches
    洛谷 P1318 积水面积
  • 原文地址:https://www.cnblogs.com/cangqinglang/p/11323380.html
Copyright © 2011-2022 走看看