我正在构建一个跟踪和增加网站访问次数的简单工具 . 这很简单:
当服务器收到GET请求时,它会将该网站的数据库中的计数器增加1 .
但是,我在谷歌Chrome的预渲染引擎(“预测网络操作以提高页面加载性能”)方面遇到了一些问题 .
该网站是www.domain.com,只要您在浏览器的地址栏中输入域名www.domain.com(不按Enter键),Chrome就会发送GET请求来预取页面,从而导致服务器记录访问并增加数据库中的计数器1.之后,如果用户按Enter键并实际加载网页,服务器将看到另一个GET请求进入,从而再次增加计数器 . 这导致在数据库中记录了2次重复访问 . 据我了解,谷歌浏览器只下载页面但不执行它,但只要我的服务器收到GET请求,计数器就会增加 .
Question :有什么方法可以解决这个问题吗?优选地,我想检测它是否是访问网站的预取或实际用户 .
1 回答
看来这是服务器端无法检测到的 .
为Chromium项目打开了一个问题 . 它被标记为“ won't fix ”(Prerendering does not have any distinguishing HTTP headers) . 预取请求不会通过查看 Headers 来轻松确认 . 我使用Wireshark检查了它们,遗憾的是,将预渲染请求与"normal"请求区分开来没有区别 .
Workaround:
您可以使用Page Visibility API检查客户端的预取页面 . 它's a bit more work than server side tracking, but you can insert a script tag in your page that checks if it'是一个预呈现请求 . 如果是这种情况,请发送一个AJAX请求,以某种方式识别它是哪个页面,并使用它来增加数据库中的计数器 .
请注意,AJAX请求不会从缓存中返回结果,从而阻止它到达服务器 .