我正在构建一个跟踪和增加网站访问次数的简单工具。这很简单:
当服务器收到GET请求时,它会将该网站的数据库中的计数器增加1。
但是,我对谷歌Chrome的预渲染引擎(“预测网络操作以提高页面加载性能”)有点麻烦。
该网站为www.domain.com,只要您在浏览器的地址栏中输入域名www.domain.com(无需按Enter键),Chrome就会发送GET请求预取页面,从而导致访问并增加数据库中的计数器的服务器日志记录1.之后,如果用户按Enter键并实际加载网页,服务器将看到另一个GET请求进入,从而再次增加计数器。这导致在数据库中记录了2次重复访问。据我了解,谷歌浏览器只下载页面但不执行它,但只要我的服务器收到GET请求,计数器就会增加。
问题:有什么方法可以解决这个问题吗?最好,我想检测它是否是预取或访问网站的实际用户。
答案 0 :(得分:4)
看来这是服务器端无法检测到的。
为Chromium项目打开了一个问题。它被标记为“无法修复”(Prerendering does not have any distinguishing HTTP headers)。预启动请求未显示在开发工具“网络”选项卡中,因此您无法通过查看标题轻松确认。我使用Wireshark检查了它们,不幸的是,将预渲染请求与“正常”请求区分开来没有区别。
解决方法:强>
您可以使用Page Visibility API检查客户端的预取页面。这比服务器端跟踪要多一些,但您可以在页面中插入一个脚本标记来检查它是否是一个预渲染请求。如果是这种情况,请发送一个AJAX请求,以某种方式识别它是哪个页面,并使用它来增加数据库中的计数器。
if (document.visibilityState !== 'prerender')
{
//ajax call registering page hit
}
请注意,AJAX请求不会从缓存中返回结果,从而阻止它到达服务器。