Nginx实现html页面注入浏览器监控js代码片段

一、背景

        最近看到关于浏览器监控相关的东西,顺带着就记录一下其实现的大致原理过程。

        在我们没对web应用做浏览器监控的时候,我们其实无法感知到用户对我们应用页面的使用习惯、使用中是否遇到问题,例如白屏情况出现多少次、请求失败情况、js代码有bug导致报错次数等等。 为了提高我们产品的一个良好迭代以及可持续运营,打磨体验感更好产品给客户,自然我们需要对客户的页面端进行有效监控,从而从中进行分析,哪些页面存在问题、什么时候出现的问题,这样方便我们运维和开发第一时间知道,并且做出处置。

二、实现原理与方式

1、基本原理

        实现方式大致逻辑如下:

        1、怎么让客户端浏览器执行我们的监控程序?

        既然是客户端浏览器页面的相关监控,那么肯定是将一些我们写好的监控程序(js脚本)注入到用户的访问页面html中,因为注入<script src="http://xxx.com/agent.js"></script>例如我们选择注入在<head></head>标签之间,用户的展示界面是不会有任何问题的,因为这个script标签脚本只会在浏览器后台默默执行,不影响页面展示

        2、那怎么在每个页面注入一段我们的<script src="http://xxx.com/agent.js"></script>脚本呢?

        第1种很笨的方法:  每个html页面都去在<head></head>标签手动加入, 缺点就是工作量大,并且随着页面越多,漏加的情况肯定是有的,并且这种方式过于人工化,浪费时间。

        第2种本质和第一种相似,但是稍微聪明一点,可以<head></head>共同的这些页面抽离出来作为公共页面, 然后每个页面去嵌入。 优点就是以后如果有更改,只改一个模板就行,其它页面不用改。缺点就是,第一次要全部页面都要加,工作量也是太大

        第3种是比较推荐的一种, 在nginx做手脚,统一使用例如正则替换的方式, 将<script>注入到<head></head>标签中。 只需要在nginx配置一次,所有经过nginx的页面或者URL都能按照这种方式进行内容替换。  优点: 工作量小,统一修改  缺点: 这个配置维护在nginx, 研发人员如果不是很清楚 的话,会比较懵逼。但是这种情况一般都是运维和研发有共同意识的,所以基本上这个也不算问题。

        第4种,自己在业务代码的html响应或者接口全局拦截器自己做一个内容替换的动作,反正最终的目的就是把<script></script>的内容注入到原始html页面中,实现客户端浏览器自动执行这段监控代码。

2、难点与挑战点

        既然你要在每个用户页面嵌入你的监控js代码片段,那么有几个问题你必须要注意:

        1、监控是一种手段,优先级要小于业务的正常运行,所有监控的前提就是不能影响业务的正常运行或者是尽量很少的影响到业务的正常运行

        2、监控代码片段不能占用太大的资源、例如大量占用客户的浏览器内存、cpu等等,给用户带来新的困扰

        3、最差的情况下,监控js代码片段可以丢弃这些监控数据,不影响业务正常运行。即使采集程序崩溃也是如此

        4、对于插入监控js代码片段,要覆盖各种能想到的异常情况,否则某些情况下导致用户页面无法渲染、白屏等情况

        5、尽量做到用户对监控js代码片段或者程序无感知、透明化

三、Nginx使用sub_filter指令进行注入

1、nginx必须包含http_sub_module模块

nginx -V查看:

2、配置内容参考如下

        sub_filter '</head>' '<script async src="http://xx.com/agent.js"></script></head>';sub_filter_once on;

3、验证一下

1、没有包含<head>标签的页面,正常访问,没有注入js脚本

服务器查看源文件内容:

浏览器显示:

源代码页面:

2、包含<head>标签页面,正常注入js脚本

服务器查看源文件内容:

浏览器显示:

源代码页面:  配置在nginx的sub_filter已经起作用,将监控的js代码片段注入到页面的head标签中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol&#xff0c;它不提供复杂的控制机制&#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻&#xff0c;立即按照原样发送到网络。 UDP报文格式&#xff1a; 各个参数说明如下&…

两条链表相同位数相加[中等]

优质博文IT-BLOG-CN 一、题目 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这…

《WebKit 技术内幕》之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程&#xff1a;首先检测事件发生处的元素有无监听者&#xff0c;如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件&#xff08;浏览器对于有些事件必须响应…

【机器学习300问】14、什么是特征工程?

当我学习到这个知识点的时候十分困惑&#xff0c;因为从名字中我完全无法理解这个什么东西。于是呢我就去问了一下维基百科&#xff0c;下面是他的回答&#xff1a; 特征工程&#xff08;英语&#xff1a;feature engineering&#xff09;又称特征提取&#xff08;英语&#xf…

消除噪音:Chain-of-Note (CoN) 强大的方法为您的 RAG 管道提供强大动力

论文地址&#xff1a;https://arxiv.org/abs/2311.09210 英文原文地址&#xff1a;https://praveengovindaraj.com/cutting-through-the-noise-chain-of-notes-con-robust-approach-to-super-power-your-rag-pipelines-0df5f1ce7952 在快速发展的人工智能和机器学习领域&#x…

python-基础篇-函数

文章目录 函数基础目标01. 函数的快速体验1.1 快速体验 02. 函数基本使用2.1 函数的定义2.2 函数调用2.3 第一个函数演练思考 2.4 PyCharm 的调试工具2.5 函数的文档注释 03. 函数的参数3.1 函数参数的使用3.2 参数的作用3.3 形参和实参 04. 函数的返回值05. 函数的嵌套调用函数…

Modern C++ 一个例子学习条件变量

目录 问题程序 施魔法让BUG浮出水面 条件变量注意事项 修改程序 问题程序 今天无意中看到一篇帖子&#xff0c;关于条件变量的&#xff0c;不过仔细看看发现它并达不到原本的目的。 程序如下&#xff0c;读者可以先想想他的本意&#xff0c;以及有没有问题&#xff1a; #…

【LeetCode每日一题】2788. 按分隔符拆分字符串

2024-1-20 文章目录 [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路&#xff1a; 2788. 按分隔符拆分字符串 思路&#xff1a; 对于每个单词&#xff0c;使用一个可变字符串 StringBuilder 来构建拆分后的单词。初始时&#xff0…

Linux: dev: glibc: 里面有很多的关于系统调用的函数

其实都没有实体源代码klogctl.c&#xff0c;而是通过编译时构造出来的源代码实体&#xff0c;比如klogctl这个函数&#xff0c;glibc的反汇编如下&#xff1a; 直接是0x67这个系统调用&#xff1a;103&#xff1a; Reading symbols from /usr/lib64/libc-2.28.so... (No debugg…

软件资源管理下载系统全新带勋章功能 + Uniapp前端

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件…

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

安全基础~攻防特性3

文章目录 SSTI(模板注入)1. 简介2. 成因3. 常见框架存在注入4. 判断存在SSTI SSTI(模板注入) 1. 简介 (Server-Side Template Injection) 服务端模板注入 1、使用框架&#xff08;MVC的模式&#xff09;&#xff0c;如python的flask&#xff0c;php的tp&#xff0c;java的sp…