首页 文章

检测Google Chrome页面预取

提问于
浏览
4

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

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

但是,我在谷歌Chrome的预渲染引擎(“预测网络操作以提高页面加载性能”)方面遇到了一些问题 .

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

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

1 回答

  • 3

    看来这是服务器端无法检测到的 .

    为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请求,以某种方式识别它是哪个页面,并使用它来增加数据库中的计数器 .

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

    请注意,AJAX请求不会从缓存中返回结果,从而阻止它到达服务器 .

相关问题