欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

解决百度统计无法获取https来源的referrer

  我们都知道,当我们的页面请求一个js文件、一个cs文件或者点击到其他页面,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段。Referrer 在分析用户的来源时非常有用,比如大家熟悉的百度统计里面就利用到 Referrer 信息了。但是遗憾的是,目前百度统计仅仅支持来源于http页面的referrer头信息;也就是说,如果你网站是http的,那么百度统计只能统计到从其他http页面进入到你网站的referrer,而如果是从https页面进入到你的网站,百度统计目前是无法统计到。

  在介绍解决办法之前,我们先来了解Referrer Policies。

Referrer Policies


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

  目前存在九种Referrer Policies,包括:空字符串、 no-referrer , no-referrer-when-downgrade , same-origin , origin , strict-origin , origin-when-cross-origin , strict-origin-when-cross-origin 以及 unsafe-url

enum ReferrerPolicy {
  "",
  "no-referrer",
  "no-referrer-when-downgrade",
  "same-origin",
  "origin",
  "strict-origin",
  "origin-when-cross-origin",
  "strict-origin-when-cross-origin",
  "unsafe-url"
};

我们这对每种Referrer Policies进行介绍。

空字符串

  空字符串表示没有referrer策略。比如我们有一个HTML标签元素 ,而且并没有声明任何的Referrer Policies,这时候的Referrer Policies就是空字符串。默认的空字符串Referrer Policies就等同于no-referrer-when-downgrade

no-referrer

  最简单的Referrer Policies就是 no-referrer ;这种Referrer Policies会导致所有的请求都不带referrer信息。比如如果 https://www.iteblog.com/archives/1929 页面将Referrer Policies设置成 no-referrer ,那么从这个页面转到 https://www.iteblog.com/(或者其他任何页面)都不会发送Referer头信息。

no-referrer-when-downgrade

  这种策略在从受TLS保护的URL跳转到任何潜在可信的URL以及从不受TLS保护的URL(比如HTTP)跳转到任何URL都会发送完整的URL Referrer 信息。

  但是如果从受TLS保护的URL(比如HTTPS)跳转不受信任的URL(比如HTTP),那么Referrer 头将不会带任何的信息。这是大多数浏览器默认的Referrer Policies。

  比如:假设 https://www.iteblog.com/archives/1929 页面的Referrer Policies设置成 no-referrer-when-downgrade ,那么从这个页面跳转到任何的 https 页面将会带上值为https://www.iteblog.com/archives/1929 的Referer头信息;但是如果从那个页面跳转到任何 HTTP 页面,将不会带上任何的Referer头信息。这就是为什么百度统计无法获取到从 HTTPS 跳转到 HTTP 的信息。

same-origin

  对于同源的链接,会发送referrer,其他的不会。同源意味着域名需要相同,iteblog.comidea.iteblog.com 是非同源的。

origin

  这种Referrer Policies对于任何资源(包括可信和不可信)来说只发送网站的根域名,不发送完整的url。比如:https://www.iteblog.com/archives/1929 页面的Referrer Policies设置成 origin,那么从这个页面跳转到任何网站将会带上值为https://www.iteblog.com/ 的Referer头信息。

strict-origin

  我们可以把他看做是 originno-referrer-when-downgrade 的结合体。也就是说,如果从受TLS保护的URL跳转到任何潜在可信的URL以及从不受TLS保护的URL(比如HTTP)跳转到任何URL都会发送根域名的 Referrer 头信息。

  但是如果从受TLS保护的URL(比如HTTPS)跳转不受信任的URL(比如HTTP),那么Referrer 头将不会带任何的信息。比如https://www.iteblog.com/archives/1929 页面的Referrer Policies设置成 strict-origin ,那么从它跳转到 https://xxx.iteblog.com 将会带上值为https://www.iteblog.com/的Referer头信息;如果从那个页面跳转到 http://idea.iteblog.com 将不会带上任何的Referer头信息。

  再比如:http://idea.iteblog.com页面的Referrer Policies设置成 strict-origin,那么从这个页面跳转到 http://books.iteblog.com 或者 https://www.iteblog.com/archives/1929 将会带上值为http://idea.iteblog.com/的Referer头信息。

  不过目前这种Referrer Policies浏览器可能不支持。

origin-when-cross-origin

  该策略在同源的链接中发送完整的URL,其他情况仅发送根域名。需要注意的是 https://www.iteblog.com 被认为是非同源的。

  比如 https://www.iteblog.com/archives/1929 页面的Referrer Policies设置成 origin-when-cross-origin ,那么从它跳转到 https://www.iteblog.com/archives/1464 将会带上值为https://www.iteblog.com/archives/1929的Referer头信息;如果从那个页面跳转到 http://idea.iteblog.com/ 页面(注意这里HTTP和HTTPS页面都可以),将会带上值为https://www.iteblog.com/的Referer头信息。

  不过这种Referrer Policies在Chrome实现的时候被误写成了 origin-when-crossorigin

strict-origin-when-cross-origin

  这种策略可以看做是 origin-when-cross-originno-referrer-when-downgrade 的结合体。对于同源请求,发送完整的URL;对于同为https的页面,或者是从HTTP页面跳转到任何的页面(包括HTTP和HTTPS)只发送根域名;如果是从https页面跳转到http将不发送referrer。

If a document at https://example.com/page.html sets a policy of "strict-origin-when-cross-origin", then navigations to https://example.com/not-page.html would send a Referer header with a value of https://example.com/page.html.
Navigations from that same page to https://not.example.com/ would send a Referer header with a value of https://example.com/.

Navigations from that same page to http://not.example.com/ would send no Referer header.

unsafe-url

  无论是否发生协议降级(HTTPS到HTTP),无论是本站链接还是站外链接,统统都发送 Referrer 信息。这是最宽松而最不安全的策略;
比如:https://www.iteblog.com/archives/1929 页面的Referrer Policies设置成 unsafe-url ,那么从它跳转到http://idea.iteblog.com/ 页面(注意这里HTTP和HTTPS页面都可以),将会带上值为https://www.iteblog.com/archives/1929的Referer头信息。

如何设置

页面是设置Referrer Policies主要有以下几种

CSP 响应头

  CSP(Content Security Policy),是一个跟页面内容安全有关的规范。在 HTTP 中通过响应头中的 Content-Security-Policy 字段来告诉浏览器当前页面要使用何种 CSP 策略。:

Content-Security-Policy: referrer

我们还可以在 里面设置:

<meta http-equiv="Content-Security-Policy" content="referrer">

<meta> 标签

  通过 标签也可以指定 Referrer 策略,同样很简单:

<meta name="referrer" content="no-referrer">

我们把<meta> 放在 <head> ...</head> 之间。注意,如果出现的位置不对会被忽略。同样,如果没有给它定义 content 属性,或者 content 属性为空,也会被忽略。如果 content 属性不是合法的取值,浏览器会自动选择 no-referrer 这种最严格的策略。

<a> 标签的 referrer 属性

通过给 <a> 标签增加 referrer 属性也可以指定 Referrer 策略,格式如下:

<a href="https://www.iteblog.com" referrer="no-referrer">过往记忆</a>

  这种方式作用的只是这一个链接。并且,<a> 标签可用的 Referrer 策略只有三种:no-referrerorigin 以及 unsafe-url 。另外,这样针对单个链接设置的策略优先级比 CSP 和 要高。

解决百度统计无法获取https页的referrer

  说到这里,如果我们想让百度统计能够统计到来源HTTPS的页面,我们有两种方式:(1)、将自己的网站也升级到HTTPS(参考《在Nginx中使用Let's Encrypt免费证书配置HTTPS》);(2)、让对方网站设置相关的Referrer Policies。

本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【解决百度统计无法获取https来源的referrer】(https://www.iteblog.com/archives/1929.html)
喜欢 (19)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!