今天还是像往常一样看自己的博客。突然发现我的网站统计显示某文章访问次数有1W+,心里不由得惊喜一番。结果发现每篇文章都是1W+。访问次数统计用的是不蒜子提供的免费服务(https://busuanzi.ibruce.info/)。难道出问题了?不由得打开f12看了下,发现请求的referrer为https://huai.pub/而不是某文章的具体页面。

排查:

由于最近切换了CDN,首先我怀疑是CDN问题。不过经过调试并没发现是有什么问题。请求头部中的一个参数引起了我的注意:

Referrer Policy: strict-origin-when-cross-origin

我记得以前没这么长啊。。后来以此为关键字查找到了相关资料。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy

no-referrer

整个 Referer 首部会被移除。访问来源信息不随着请求一起发送。

no-referrer-when-downgrade (默认值)

在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。

origin

在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。

origin-when-cross-origin

对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。

same-origin

对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。

strict-origin

在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。

strict-origin-when-cross-origin

对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。

unsafe-url

无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。

之前的默认值是 no-referrer-when-downgrade,而现在变成了 strict-origin-when-cross-origin。经过查找,原来是chrome85以上做出了默认规则的改变。 https://developers.google.com/web/updates/2020/07/referrer-policy-new-chrome-default

Chrome plans to switch its default policy from no-referrer-when-downgrade to strict-origin-when-cross-origin, starting in version 85.

解决:

  1. 通过修改http响应头部的Referrer-Policy字段来指定所使用的referrer规则。例如nginx添加头部

    add_header Referrer-Policy 'no-referrer-when-downgrade';

  2. 直接通过修改html头部meta参数对referrer规则进行指定。

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