检测 Google Chrome 页面预取

2023-12-20

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

当服务器收到 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(使用前将#替换为@)

检测 Google Chrome 页面预取 的相关文章

随机推荐

  • 如果从 C# 代码调用,则捕获 EXE 文件中的错误

    我正在从 C 代码运行 exe 文件 由于某些原因 该 exe 文件中出现错误 它一直等待并最终给出弹出错误 abc exe已停止工作 等 但它不退出 The below code is calling it successfully pu
  • NetworkX:在Python中连接两个独立图的节点

    这个问题是关于尝试建模相互依存的网络 https en wikipedia org wiki Interdependent networks与 NetworkX 一起 有专用的包 例如Pymnet http people maths ox
  • node.js - 向子进程发送快捷键

    我的程序生成 ssh 作为子进程 连接到服务器 然后能够写入流并读取其输出 这一切都很好 当我将 ls 写入进程流时 我会得到文件列表 但现在 我想发送此进程的快捷键 以便我可以中止 ssh 会话中正在运行的进程 我知道这也可以通过流来完成
  • 如何在OpenCV中将16位图像转换为32位图像?

    我是 OpenCV 新手 我的程序读取 16 位无符号整数的图像数据 我需要将图像数据乘以 16 位无符号整数的增益 因此 生成的数据应保存在 32 位图像文件中 我尝试了以下操作 但得到了 8 位全白图像 请帮忙 Mat inputDat
  • 无法读取.net core 2.1中的用户机密

    我在尝试读取用户机密时遇到问题 我在startup cs中的代码如下 public Startup IHostingEnvironment env var builder new ConfigurationBuilder SetBasePa
  • 当受管节点是 Windows 主机时如何查找“env”?

    我需要获取 Windows 路径变量 UserProfile 进入 Ansible 剧本 例如 env USERPROFILE 如果我的受管节点是 Linux 主机 我想像 vars wPath lookup env USERPROFILE
  • 函数语句与函数表达式奇怪的行为

    var a function b console log typeof b gives undefined console log typeof a gives function 为什么两个输出有差异 我理解函数表达式和函数语句之间的区别
  • 在 Spark on Yarn 中使用类型安全配置

    我有一个从配置文件读取数据的 Spark 作业 该文件是类型安全的配置文件 读取配置的代码如下所示 ConfigFactory load getConfig com mycompany 现在我不将 application conf 组装为我
  • 带有父子行的 Angular Material 垫表的替代颜色

    我有一个有角度的材料mat table我使用 CSS 样式来替代行颜色 这是 CSS 样式 mat row nth child even background color e4f0ec mat row nth child odd backg
  • 如何正确安装 django-nose?

    我在运行 django nose 时遇到问题 Per the 安装说明 https github com jbalogh django nose 我安装的方式是 Running pip install django nose Adding
  • Python:如何使用splinter/浏览器一次性填写表单?

    目前 我正在网站上填写表格 内容如下 browser fill form firstname Mabel browser fill form email email protected cdn cgi l email protection
  • 有没有办法从 Excel 特定单元格收集数据并发送给 SQL Server?

    我有一个 Excel 表格模板 希望用户每天填写 一张表告诉我哪些单元格正在读 写 意味着我想将哪些单元格发送到我的数据库 该形式不是管状的 即 有时数据被设置 A3 gt A4 或 A3 gt B3 我想知道是否有 Excel 插件或任何
  • OAuth登录完成后重定向到之前的URL(flask-dance)

    我正在开发一个 Flask 应用程序 允许用户使用 OAuth 以 Github 作为提供者 和 Flask dance 库登录 由于某种原因 成功登录后 我无法重定向到我将用户发送到登录页面的页面 当用户尝试连接时 例如http loca
  • c 函数是否可以同时接受 double 和 long double 参数?

    我在文件 mag c 中有一个函数 mag 用于计算数组的大小 include
  • 在Master上触发事件并在Salt Minion上等待“响应事件”

    我想要的是由 Minion 调用的类似 RPC 的行为 并将其放入某种脚本中 然后可以由任何 非 Salt 非 Python 应用程序和服务调用 在Master上触发一个事件 有效负载对应于命令行参数 the Reactor system
  • 创建的 PDF 不反映对原始文档所做的更改

    我有一个 Google 文档模板 它会自动复制到文件夹中 并用电子表格单元格中的值替换特定值 该模板包含诸如以下的值 lt lt 41 gt gt 它们用于 查找并替换 来自电子表格的值 查找和替换过程很好 文档的结果如下图所示 现在 我希
  • 查找特定值的列名或表名

    我想在我的数据库中搜索一个特定的值 但我不知道它到底在哪里 SQL Server中是否存在返回特定值的列名或表名的查询 假设我有一个像 123 这样的列的值 但我不知道 123 属于哪个表 也不知道它的列名称 我可以编写一个查询来查找该值所
  • 纬度/经度转换为 x/y 坐标

    我有一个 openstreetmap 图像 左上角是纬度 80 经度 169 右下角是纬度 56 经度 190 图像的宽度 2618 高度 1513 如何将给定的纬度 经度坐标转换为图片的 x y 坐标 我自己尝试了一下 但不知道如何转换坐
  • CSS 悬停工具提示的 z 索引

    我仅使用 CSS 悬停缩略图
  • 检测 Google Chrome 页面预取

    我正在构建一个简单的工具来跟踪和增加网站的访问次数 这很简单 当服务器收到 GET 请求时 它会将数据库中该网站的计数器加 1 但是 我在使用 Google Chrome 的预渲染引擎时遇到了一些问题 预测网络操作以提高页面加载性能 该网站