检测Google Chrome页面预取

我正在构build一个跟踪和增加网站访问次数的简单工具。 这是简单的:

当服务器收到一个GET请求时,会将该网站数据库中的计数器增加1。

不过,我正在使用Google Chrome的预渲染引擎(“预测networking操作以提高页面加载性能”)出现问题。

该网站是www.domain.com,只要您在浏览器的地址栏中input域名www.domain.com(无需按Enter键),Chrome会发送一个GET请求来预取页面,导致服务器logging访问并将数据库中的计数器增加1.此后,如果用户按Enter键实际加载网页,则服务器将看到另一个GET请求进入,从而再次增加计数器。 这导致在数据库中logging2次重复访问。 据我所知,谷歌浏览器只下载页面,但不执行它,但只要我的服务器获得GET请求,计数器增加。

:有什么办法可以解决这个问题吗? 优选地,我想检测是否是预取或实际用户访问网站。

看来,这是不可检测的服务器端。

Chromium项目为此开启了一个问题。 它被标记为“ 不会修复 ”( 预渲染没有任何可区分的HTTP标头 )。 预取请求不会显示在开发工具“networking”选项卡中,因此您无法通过查看标题来轻松确认。 我用Wireshark检查了它们,不幸的是,预渲染请求与“正常”请求没有区别。

解决方法:

您可以使用页面可见性API检查客户端预取的页面。 这比服务器端跟踪还要多一点,但是可以在页面中插入一个脚本标记,检查它是否是预渲染请求。 如果是这样的话,发送一个AJAX请求,以某种方式标识它是哪个页面,并使用它来增加数据库中的计数器。

if (document.visibilityState !== 'prerender') { //ajax call registering page hit } 

只要注意,AJAX请求不会从caching中返回结果,从而阻止它到达服务器。