杭州网站建设seo怎么查网站哪里做的

diannao/2026/1/25 9:10:19/文章来源:
杭州网站建设seo,怎么查网站哪里做的,平台推广,做网站如何用模板我们公司在用nginx的userid模块作为简单的用户请求追踪使用。这个模块其实并不能真正记录用户的请求状态#xff0c;只能作为一个辅助使用。但是在一些场景下会有一些异常。下面我们简单介绍一下这个模块到底做了什么。 userid 模块简介 官网说明文档 ngx_http_userid_modul…我们公司在用nginx的userid模块作为简单的用户请求追踪使用。这个模块其实并不能真正记录用户的请求状态只能作为一个辅助使用。但是在一些场景下会有一些异常。下面我们简单介绍一下这个模块到底做了什么。 userid 模块简介 官网说明文档 ngx_http_userid_module 官网示例 userid on; userid_name uid; userid_domain example.com; userid_path /; userid_expires 365d; userid_p3p policyref/w3c/p3p.xml, CPCUR ADM OUR NOR STA NID;配置说明userid on |v1 | log | off;userid开关userid_name uid;userid (cookie)名userid_domain example.com;userid (cookie) domainuserid_path /;userid (cookie) 路径userid_expires 365d;userid (cookie) 过期时间userid_p3p ‘policyref“/w3c/p3p.xml”, CP“CUR ADM OUR NOR STA NID”’;p3p header 标记 简单来说这个模块的作用就是当客户端的请求cookie中未携带userid字段或者userid字段不合法时nginx在response中会加一个Set-Cookie 的 header。如果配置了p3p会额外返回p3p的header set-cookie: uidCrINEGWBDAFNOTILCEHMAg; expiresThu, 18-Dec-25 03:20:33 GMT; domainexample.com; path/ p3p: policyref/w3c/p3p.xml, CPCUR ADM OUR NOR STA NID这样同一个客户端将会获得相同的uid可以作为用户请求追踪的请求特征。但是要注意的是这个cookie的设置逻辑很简单并且没有用户的登录态吧所以并不可靠。如果用户使用不同浏览器或者无痕访问就会获得不同的uid通过他来进行uv等数据统计获得的结果会虚高。 nginx官网对userid模块的介绍比较简单我们可以看下他的源码来分析一下他的生成和校验逻辑细节。 我们以文章发布时候最新的1.24版本的nginx源码为例 nginx github路径 userid filter核心函数 nginx userid 是一个 http filter 模块请求进来后通过调用 ngx_http_userid_filter 这个函数来执行 userid的逻辑ngx_http_userid_filter这个函数主要调用了 ngx_http_userid_get_uid 和 ngx_http_userid_set_uid。分别用于获取和生成userid userid的生成逻辑 我们先看下ngx_http_userid_get_uid 这个获取uid的函数。我节选一些核心代码 static ngx_http_userid_ctx_t * ngx_http_userid_get_uid(ngx_http_request_t *r, ngx_http_userid_conf_t *conf) {ctx ngx_http_get_module_ctx(r, ngx_http_userid_filter_module);...cookie ngx_http_parse_multi_header_lines(r, r-headers_in.cookie,conf-name, ctx-cookie);if (cookie NULL) {return ctx;}ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r-connection-log, 0,uid cookie: \%V\, ctx-cookie);if (ctx-cookie.len 22) {ngx_log_error(NGX_LOG_ERR, r-connection-log, 0,client sent too short userid cookie \%V\,cookie-value);return ctx;}src ctx-cookie;/** we have to limit the encoded string to 22 characters because* 1) cookie may be marked by userid_mark,* 2) and there are already the millions cookies with a garbage* instead of the correct base64 trail */src.len 22;dst.data (u_char *) ctx-uid_got;if (ngx_decode_base64(dst, src) NGX_ERROR) {ngx_log_error(NGX_LOG_ERR, r-connection-log, 0,client sent invalid userid cookie \%V\,cookie-value);return ctx;}ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r-connection-log, 0,uid: %08XD%08XD%08XD%08XD,ctx-uid_got[0], ctx-uid_got[1],ctx-uid_got[2], ctx-uid_got[3]);return ctx; }首先通过 ngx_http_parse_multi_header_lines 查找cookie中 uid的字段值存到ctx的结构体中。 cookie ngx_http_parse_multi_header_lines(r, r-headers_in.cookie,conf-name, ctx-cookie);ngx_http_parse_multi_header_lines这个函数虽然叫分析header但是我看了下他的代码实现更像是解析cookie的。它传入3个参数存放header其实是cookie如果请求中有多个cookie header字段那么就会对应多个数组元素的数组cookie字段名的字符串以及要将查找出来的字符串存放到的位置。返回值cookie字段所在的header数组的index没查到则返回 NGX_DECLINED是一个负值。这个函数的返回值在这里没啥太大作用。 拿到 uid之后就做了两个简单的操作一个是长度是否小于22另一是base64解码解码的时候只会取uid的前22个字符所以只要前22个字符合法就可以并存到ctx-uid_got。 异常的话分别会打error log client sent too short userid cookie 或者 client sent invalid userid cookie 。 生成uid ngx_http_userid_set_uid会先通过调用 ngx_http_userid_create_uid来生成uid。 ngx_http_userid_create_uid会将uid的四个int数据存到 ctx-uid_set中uid_set和uid_got一样都是一个长度为4的int数组如果ctx-uid_got已经有数据了就会直接复制到uid_set中。 如果uid_got中没有的话就会生成uid。根据配置中的userid的on和v1的区别生存逻辑略有不同。v1的生成逻辑比较简单。 if (conf-service NGX_CONF_UNSET) {ctx-uid_set[0] 0;} else {ctx-uid_set[0] conf-service;}ctx-uid_set[1] (uint32_t) ngx_time();ctx-uid_set[2] start_value;ctx-uid_set[3] sequencer_v1;sequencer_v1 0x100;uid_set[0] 是个固定值uid_set[2]每个worker是固定的。 默认的on的逻辑稍微复杂一些比如uid_set[0]使用了监听连接地址。但是总得来看他们的生成逻辑差不太多如果你一直使用同一个nginx同一个worker接收请求会发现生成出来的uid有很多位是一直不变的。uid_set[1] 和 uid_set[3]分别是nginx的当前时间和一个计数器uid的生成更接近一个顺序增加产生的由于里面包含时间信息几乎不用担心uid冲突。 uid 信息提取 根据上面的生成逻辑我们可以知道nginx userid 模块生成的cookie是有服务端地址和生成时间的我们可以写一个简单的脚本来分析这个cookie。 下面是一段python3代码 import base64 import datetimeclass CookieUID(object):def __init__(self, cookie_uid):self.cookie_uid cookie_uidself.b_cookie_uid bself.check_and_b64decode()def check_and_b64decode(self):if len(self.cookie_uid) ! 22 and len(self.cookie_uid) ! 24:raise ValueError(cookie uid 的长度需要时22或者24)if len(self.cookie_uid) 22:self.cookie_uid elif self.cookie_uid[-2:] ! :raise ValueError(24字节的cookie_uid 需要以 结尾)self.b_cookie_uid base64.b64decode(self.cookie_uid)def print_info(self):self.print_server_addr()self.print_generated_date()def print_server_addr(self):print(server_addr: , end)for i in range(4):print(self.b_cookie_uid[i], end)if i 3:print(., end)else:print()def print_generated_date(self):generated_timestamp int.from_bytes(self.b_cookie_uid[4:8])print(cookie uid generate time: , datetime.datetime.fromtimestamp(generated_timestamp))if __name__ __main__:cookie_uid CookieUID(fwAAAWWFOcoflzElAwMGAg) 输出结果是 server_addr: 127.0.0.1 cookie uid generate time: 2023-12-22 15:24:58写入uid ngx_http_userid_set_uid 调用完生成userid_create_uid 之后就进行生产cookie的操作。 他会先计算一下将要生产的cookie长度然后申请一块内存。 cookie ngx_pnalloc(r-pool, len);然后将要生成的cookie数据写入或拷贝到cookie的内存中第一段写入的就是userid对应的cookie p ngx_copy(cookie, conf-name.data, conf-name.len);*p ;if (ctx-uid_got[3] 0 || ctx-reset) {src.len 16;src.data (u_char *) ctx-uid_set;dst.data p;ngx_encode_base64(dst, src);p dst.len;if (conf-mark) {*(p - 2) conf-mark;}} else {p ngx_cpymem(p, ctx-cookie.data, 22);*p conf-mark;*p ;}他会先检查之前ctx-uid_got有没有获取到数据有的话就直接拷贝之前存在ctx-cookie的数据并且只会拷贝22个字符。没有的话就通过之前create生成到ctx-uid_set中的字节通过base64变成成字符串。之后会写入一写其他cookie字段比如配置中配的domain之类的。 最后通过 ngx_list_push申请header的链表节点结构体将value指向之前生成的cookie数据上。 set_cookie ngx_list_push(r-headers_out.headers);set_cookie-hash 1;ngx_str_set(set_cookie-key, Set-Cookie);set_cookie-value.len p - cookie;set_cookie-value.data cookie;p3p因为是一个单独的header所以他也是通过 ngx_list_push 这种方式新增一个header节点。 写到这里其实有个疑问按照这个模块的逻辑不管之前请求中是否携带userid响应头中都会进行set-cookie的操作这个跟我们实际的现象不太相符。实际中如果有合法的userid cookienginx响应头不会再次进行返回set-cookie的header了这需要后续仔细看下。 uid的插入时机 然后我们在使用中遇到一个问题是nginx生成的uid是否能通过某些手段控制他的生成呢比如满足某些情况通过add_header 将其set-cookie置空。这就涉及到nginx模块的执行循序问题。 nginx的header模块执行顺序是通过一个单向链表来实现每个模块在初始化的时候会将自己放到链表的头部 static ngx_int_tngx_http_userid_init(ngx_conf_t *cf){ngx_http_next_header_filter ngx_http_top_header_filter;ngx_http_top_header_filter ngx_http_userid_filter;return NGX_OK;}nginx在处理请求时会遍历这个链表依次执行对应的filter模块。所以模块初始化的逆序就是各个filter模块的执行顺序。而模块的初始化是在nginx编译的时候进行的所以可以通过configure生成的ngx_modules.c的顺序来判断filter模块执行顺序。还是以add_header 和 userid为例。add_header属于ngx_http_header_filter_moduleuserid属于ngx_http_userid_filter_module。 userid在add_headerngx_http_userid_filter_module的上面执行顺序是先执行add_header再执行userid。由于这两个都控制header的filter所以按照优先级来看userid的优先级更高。 结语 以上就是全部内容了。这个简单的nginx http filter模块依然涉及很多nginx内部的框架逻辑大部分都是自己阅读的难免会有纰漏恳请各位大佬斧正~

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

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

相关文章

龙华区网站建设政元软件做网站

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段(图片视频等)五、Batch批量插入🙆🏻‍♀️🙆🏻‍♀️文末最新版jdbc jar包下载 🙆&#x1f3fb…

网站备案号 如何添加目前网站开发应用到的技术有什么

JVM(Java虚拟机)是Java平台的核心组件之一,它是一个虚拟计算机,可以执行Java字节码文件。JVM解释并执行Java字节码,并提供了其他功能,如内存管理和垃圾回收。 JVM的基本功能包括以下几个方面: …

wordpress建立移动站能源门户网站建设

1、stack容器(栈) 1.1 栈stack基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界调用,因此栈不允许有遍历行…

cms网站官方网站包括哪几个网站

当你审查别人的代码时,你会寻找什么? 无论你是通过像 Upsource 这样的工具来审查代码,还是在同事讲解他们代码的过程中进行审查,在任何情况下,有些事情都比其他事情更容易评论。比如: 格式:空…

长春制作手机网站自己制作的网页别人如何访问

嵌入式人工智能----最热门的人工智能商业化技术之一 “嵌入式人工智能是当前最热门的人工智能商业化技术之一。所谓嵌入式人工智能,就是设备无须通过云端数据中心进行大规模计算,而是在本地、不联网的情况下就可以做到实时环境感知、人机交互、决策控制…

建怎样的网站挣钱快百度seo关键词优化si

目录 前言:什么是JDBC 一、准备工作(一):MySQL安装配置和基础学习 二、准备工作(二):下载数据库对应的jar包并导入 三、JDBC基本操作 (1)定义记录的类(可选) (2)连接的获…

网站开发可行性街区网站建设

《金融保险会计》模拟题 单选题 1.下列不符合外汇分账制基本要求的有(). A.对各种外币的收付凡有人民币牌价的平时都按原币填制凭证登记账簿编制报表 B.对各种外币的收付凡有人民币牌价的平时都按人民币填制凭证登记账簿编制报表 C.设置”外汇买卖”科目 D.各种外币分别设置一…

网站搭建类型海报设计网站免费

今天我们来聊一聊 C# 中的本地函数。本地函数是从 C# 7.0 开始引入,并在 C# 8.0 和 C# 9.0 中加以完善的。引入本地函数的原因我们来看一下微软 C# 语言首席设计师 Mads Torgersen 的一段话:Mads Torgersen:我们认为这个场景是有用的 —— 您…

网站模板安装出现预先建设数据库各种网站开发工具

电源、时钟、复位是主板能正常工作的三大要素。主板在电源、时钟都正常后,复位系统发出复位信号,主板各个部件在收到复位信号后,同步进入初始化状态。如图7-11所示为复位电路的工作原理图,各个十板实现复位的电路不尽相同&#xf…

怎么制作网站上传wordpress 随机显示

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 1. 法一:指针法 解题思路 我们以每一个窗口来看,找…

免费商城网站模板企业网站建设及维护费用

博物馆是人们了解历史文化、传承文明的重要场所。而博物馆的藏品管理是博物馆的核心工作之一,对于展现博物馆的魅力、吸引观众的眼球有着至关重要的影响。并且博物馆藏品管理是一项复杂且专业的工作,它涉及到多个方面,包括但不限于藏品的收集…

哪个网站可以做兼职讲师wordpress 更改页面排版

因为您在调用 请求接口的函数如getLocaltion() 方法时没有订阅返回的 Observable,或者在订阅 Observable 时没有正确处理其响应。即要subscribe接口,并正确处理。因为Observables 是惰性执行的。这意味着如果您创建了一个 Observable 对象,但…

网站素材免费下载公司宣传册设计与制作图片

目录 二分图概念 二分图应用场景 如何判定一个图是否可以划分成二分图 证明 染色法 原理步骤 时间复杂度 算法思路 例子 匈牙利算法 概念 匈牙利使用算法前提,场景 时间复杂度 算法思路 例子 二分图概念 二分图是图论中的一个重要概念,指的是一个图的…

合肥做网站推广的公司国字型网站建设布局

对win8开发,上一节我们对win8进行了简单的介绍,这一节我们来瞧一瞧他的开发环境搭建。 前奏。 这里所讲的win8开发,主要是指Windows8 app store 上开发,及metro ui或叫morden ui 程序的开发。传统桌面应用程序,网站应…

网站建设最贵服务商如何在建设教育协会网站注册考试

quickrun 是一款rk3588 rknn多模型高效高并发部署软件 软件框架 采用session思想,可以定义多个session满足不同模型的义务需求。比如充电桩检测,垃圾分类,悬崖检测,模型共用一个摄像头,采用yolov5的模型。 采用消息…

一个域名多个网站门店推广是什么意思

console.log("嵌套函数中调用fn this值被赋给self" self o);这个输出会是 false。 在 JavaScript 中,比较两个对象是否相等时,实际上比较的是它们在内存中的引用地址,而不是它们的属性值。即使两个对象有相同的属性值&#xff…

宁波做网站优化哪家好网站收录怎么做

一、堆树的定义 堆树的定义如下: (1)堆树是一颗完全二叉树; (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值; (3)堆树中每个节点的子树都是堆树。 当父节点的键…

网站切换中英文贵州最新消息今天

全世界只有3.14 % 的人关注了数据与算法之美近日,一份滴滴出行内部流传出来的财务数据显示,该公司2018年持续巨额亏损,全年亏损高达109亿元人民币。若消息属实,那将说明,自2012年滴滴成立以来就一直处于亏损状态&#…

营销网站怎样做有什么做任务拿钱的网站

首先要声明一点,zk集群中,leader服务器有着比较重要的存在,Follower 服务器只是处理非事务性请求,leader服务器主要负责事务性请求,Follower 服务器在遇到事务性请求以后还是会转发给leader服务器处理,所以…

富阳网站公司怎么注册一个域名

不管是component还是分文件编写的一个自定义组件,遵循如下: a:不管哪一级的子对象 都可以直接调根节点下的方法和属性 b:不管哪一级的子对象 调用非根节点的方法和属性,前面要加上该节点的id,即id.方法()或id.属性的形式 import QtQuick 2.…