百度统计失效,referrer背锅了

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前段时间遇到一个问题,就是我的个人网站需要接入第三方百度统计,因为我的文章图片有来自第三方微信后台上传的文章,所以使用<meta name="referrer" content="no-referrer">解决图片访问403的问题,但是此时这个导致我百度统计失效了,于是去查询了一下referrer这个特性。

前段时间遇到一个问题,就是我的个人网站需要接入第三方百度统计,因为我的文章图片有来自第三方微信后台上传的文章,所以使用解决图片访问403的问题,但是此时这个导致我百度统计失效了,于是去查询了一下referrer这个特性。


正文开始...


referrer


这个主要主要是来防护CORS跨站请求伪造的一个标识,对于来源于自身服务器,会默认在请求头中带入refer信息


什么意思,具体看下下面


当我们在html的header中使用

640 (12).png

请求头的General


Referrer Policy: no-referrer

request中整个Referer信息会被删除


如果我们没有加meta标签no-referrer


640 (13).png

那么此时你会发现默认请求头里是


Status Code: 200 OK
Referrer Policy: strict-origin-when-cross-origin

然后请求头request-header里面就会携带了Referer


Referer: http://localhost:8080/

关于referrer的更多信息可以参考http referer策略[1]


我的网站需要不带referrer,因为微信图片如果带了当前站点的referrer就会有问题,所以此时怎么加上百度统计代码呢?


由于最初是这样加入统计的


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="referrer" content="no-referrer" />
    <title>js执行顺序</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <h1>js执行顺序</h1>
    </div>
    <script src="https://hm.baidu.com/hm.js?c7002d193ba43df9317b7fc847709213"></script>
  </body>
</html>

这样的做法是我们通用的方式,就是script脚本放入body中,但是这样会导致百度统计不到,因为meta中已经使用no-referrer了,那怎么办呢?我网页中又需要加no-referrer,不加这个,会导致第三方图片显示不出来。


页面渲染


此时我们需要了解另外一个知识,就是浏览器页面是怎么渲染的


我们写一段测试代码


<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- <meta name="referrer" content="no-referrer" /> -->
    <title>js执行顺序</title>
    <script>
      alert(111);
    </script>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <h1>js执行顺序</h1>
    </div>
    <script src="https://hm.baidu.com/hm.js?c7002d193ba43df9317b7fc847709213"></script>
  </body>

html页面渲染是根据标签顺序同步渲染的,而且script标签会阻塞Dom的渲染

640 (14).png

此时你会看到页面弹框,但是html内容并没有完全渲染出来


当我确认弹框后,页面才显示出来


640 (15).png

我们在header中加入一行css代码


<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- <meta name="referrer" content="no-referrer" /> -->
    <title>js执行顺序</title>
    <style>
      body {
        background-color: red;
      }
    </style>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <h1>js执行顺序</h1>
    </div>
    <script>
      alert(111);
    </script>
    <script src="https://hm.baidu.com/hm.js?c7002d193ba43df9317b7fc847709213"></script>
  </body>

我们会发现,页面先绘制成了红色,然后再执行script脚本,最后页面内容显示出来了


640 (16).png

html标签会按照顺序执行,背景先是变成了红色,然后内容没有立即显示出来,执行script脚本后,才显示了页面内容,这就证明了js会阻塞页面的解析,所以在文章开头,我们要设置referrer,那么我们先执行script统计脚本,然后再设置meta


<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://hm.baidu.com/hm.js?c7002d193ba43df9317b7fc847709213"></script>
    <meta name="referrer" content="no-referrer" />
    <title>js执行顺序</title>
    <style>
      body {
        background-color: red;
      }
    </style>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
    </style>
  </head>

所以我们看到百度统计脚本是正常默认的,但是其他基本就是no-referrer

917143305ffe74293db7c1c31a5000bb.png

其他脚本,因为header设置了meta

21d25471e071e98e0321b219a59882c5.png

所以解决百度统计代码失效的办法就是在设置meta之前执行就行


CSS会阻塞页面解析吗


在以前面试中,就曾经有问到这个问题,css到底会不会阻塞dom的解析,这时常是一个令人模糊的问题


举个例子证实一下自己的猜想


新建一个index.html


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>js执行顺序</title>
    <link rel="stylesheet" href="./index.css" />
  </head>
  <body>
    <div class="app">hello word</div>
  </body>
</html>

然后我引入index.css


我在index.css写入测试代码


.app {
  background-color: red;
}
aaa

你会发现,我在css文件中写入了一段非css的代码


但是页面依旧能够正常渲染

715e48362096a552864358541647af34.png

所以从以上可以证明,css并不会阻塞是dom解析dom解析css渲染是并行的,css负责渲染标签样式,html只是负责解析内容标签,css渲染html解析主要是在GUI线程里面,GUI线程主要是构建DOM Tree,Style Tree,Render Tree布局以及绘制。


JS是单线程的


我们经常会在面试中被问到JS为什么是单线程的,有时会被问得哑口无言。


我们想想JS祖师爷在设计这门语言肯定有其初衷和取舍,浏览器是多进程的,浏览器的每一个窗口就是一个进程,而进程之间都应该是互相独立的,而每一个进程里面的线程是独立,所以js设计时就是单线程的,每个线程之间互不影响


所以JS设计就是单线程的,通常来讲为了弥补单线程的缺陷,所以有了同步任务与异步任务的设计,在浏览器渲染页面,解析dom Tree,绘制css tree,通常在主线程执行栈中优先执行同步任务,主线程执行栈执行完了,然后再执行异步任务,异步任务主要会进入队列中,遵循先进先出原则,直到队列执行完毕为止。


css会阻塞js执行吗?


我们做个实验,在style标签前后都引入一段js执行


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- <meta name="referrer" content="no-referrer" /> -->
    <title>js执行顺序</title>
    <script>
      var start = new Date().getTime();
      console.log("before css");
    </script>
    <link rel="stylesheet" href="./index.css" />
    <!-- <link
      href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.0/css/bootstrap.css"
      rel="stylesheet"
    /> -->
    <script>
      var end = new Date().getTime();
      console.log(end - start, "difftime");
      console.log("after css");
    </script>
  </head>
  <body>
    <div class="app">hello word</div>
    <script>
      const app = document.getElementsByClassName("app")[0];
      app.style.backgroundColor = "green";
    </script>
  </body>
</html>

引入index.css

450026d0ba1d52376ae3f80fcdd8d374.png

引入bootstrap.css

5411c039ca9ae3d5ce0bd9853f457eec.png

我们引入bootstrap.css与引入我们自己的index.css,自此你会发现,最后执行的时间很明显,引入bootstrap的css打印的时间差明显是要大于体积小的css的


所以css是会阻塞js的执行的


但是一般情况,我们不会这么干,一般都会在header中引入css,在body结束标签引入脚本


也就大概会是下面这样


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./index.css">
</head>
<body>
    <div id="app"></div>
    <script>
        console.log('hello')
    </script>
</body>
</html>


总结


  • 当你百度统计失效时,如果网站meta使用了no-referrer,如果是在统计脚本之前执行,那么此时需要先执行统计脚本,然后再设置meta
  • js会阻塞dom tree解析,css不会阻塞dom tree解析,css只会影响dom tree的绘制
  • css的加载是会阻塞js的运行的,css体积越小影响越小
  • 外部资源的最佳方式,header引入外链css,body结束标签引入script脚本
  • 本文示例code example[2]
相关文章
|
前端开发 安全 程序员
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
93 0
|
存储 缓存 JSON
印象最深的一个bug:sessionStorage缓存在移动端失效
印象最深的一个bug:sessionStorage缓存在移动端失效
|
存储 JSON 安全
【面试高频】cookie、session、token?看完再也不担心被问了
【面试高频】cookie、session、token?看完再也不担心被问了
【面试高频】cookie、session、token?看完再也不担心被问了
handsome主题博客信息添加访客数量和网站响应耗时
handsome主题博客信息添加访客数量和网站响应耗时
296 1
|
Web App开发 Java
小玩意 - Chrome插件——GreenChrome(GC)失效如何解决?
小玩意 - Chrome插件——GreenChrome(GC)失效如何解决?
417 0
怎么判断网站友情链接的价值?
我们从事排名优化,交换友谊链接是不可避免的。如果能和高权重的网站交换友谊链,肯定会给自己的网站增加信赖度和权重,带来流量。那么今天讲下seo入门教程的内容,如何通过seo数据分析判断友链价值。
怎么判断网站友情链接的价值?
|
监控 安全
您的url被百度杀毒提示存在网址安全风险,故物料不宜推广的解决办法
春节刚过完,上班的第一天,公司网站被百度停止推广了,百度推广提示:您的url被百度杀毒提示存在网址安全风险,故物料不宜推广;若有异议,请进入百度杀毒申诉通道申诉。第一时间联系了当地百度公司客服,客服帮我们查看了下百度那面反馈的邮件后,说是由于我们网站内容被篡改,导致存在网址安全风险,因此百度推广不让上线,对于我们公司网站产品的推广带来了很大的影响,老板立即把我叫到了办公室。
2368 0
|
CDN
网站内页被百度取消排名的原因和解决方法
网站运营过程中,有些敏感操作,会让网站被降权。降权的具体表现是首页快照滞后无排名、内页排名消失、K站等。被降权的网站,内页的排名很难恢复。那么遇到此类问题,该如何处理呢?安邦运维和大家一起来学习一下内页排名丢失的原因和解决方法。
1062 0
|
搜索推荐 SEO 算法
百度排名怎么才能排在前面?除了百度推广还有什么办法?
如何在百度中排名靠前? 能不能请你写一个帖子上正是这样做的排名在百度高清晰的路径?”“我应该怎么做,以确保我的排名能超过我的比赛?”“你可以写一个明确的,采取逐步关于如何在百度中排名靠前的步骤列表?“虽然我完全理解这些问题但回答它们确实非常非常困难。
1779 0
|
安全
瑞星:周末拦截挂马网站数减少 新闻类网站占主打
据瑞星“云安全”系统监测,5月15日至17日,“四川新闻网-国内频道”、“浙江在线新闻网站”、“中华英才网”等网站被黑客挂马,用户浏览这些网站后,会感染木马病毒:Trojan.Spy.Win32.KeyLogger.eru(木马病毒),导致用户信息丢失。
994 0

热门文章

最新文章