我正在构建一个简单的工具来跟踪和增加网站的访问次数。这很简单:
当服务器收到 GET 请求时,它会将数据库中该网站的计数器加 1。
但是,我在使用 Google Chrome 的预渲染引擎时遇到了一些问题(“预测网络操作以提高页面加载性能”)。
该网站是 www.domain.com,只要您在浏览器地址栏中输入域名 www.domain.com(无需按 Enter 键),Chrome 就会发送 GET 请求来预取该页面,从而导致服务器记录以下内容:访问并将数据库中的计数器增加 1。之后,如果用户按 Enter 键并实际加载网页,服务器将看到另一个 GET 请求传入,从而再次增加计数器。这会导致数据库中记录 2 次重复访问。据我了解,Google Chrome 只下载页面但不执行它,但是一旦我的服务器收到 GET 请求,计数器就会增加。
Question: 有什么办法可以解决这个问题吗?最好,我想检测访问该网站是预取还是实际用户。
看来这是无法检测到的服务器端。
为此 Chromium 项目提出了一个问题。它被标记为“不会修复" (预渲染没有任何区分 HTTP 标头 https://code.google.com/p/chromium/issues/detail?id=86175)。预取请求不会显示在开发工具的“网络”选项卡中,因此您无法通过查看标头轻松确认这一点。我使用 Wireshark 检查了它们,不幸的是,区分预渲染请求和“正常”请求没有区别。
解决方法:
您可以使用以下命令在客户端检查预取的页面页面可见性API https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API。这比服务器端跟踪需要更多工作,但您可以在页面中插入一个脚本标记来检查它是否是预渲染请求。如果是这种情况,请发送一个 AJAX 请求,该请求以某种方式标识它是哪个页面,并使用它来增加数据库中的计数器。
if (document.visibilityState !== 'prerender')
{
//ajax call registering page hit
}
请注意,AJAX 请求不会从缓存返回结果,从而阻止其到达服务器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)