nginx过滤模块怎么生效的

news2024/10/19 1:37:29

在nginx中,如果你要开发一个过滤模块,config中必须要加

HTTP_FILTER_MODULES=$HTTP_FILTER_MODULES xxx

否则,即使在postconfiguration回调中加了ngx_http_top_header_filter=my_xxxx_filter_handle,最终my_xxxx_filter_handle也不会调用。这是如何做到的呢?

搜索HTTP_FILTER_MODULES,这个变量似乎没做什么事,就是保存了过滤模块而已。

我们知道只要加了HTTP_MODULES=$HTTP_MODULES xxx即可,我们的模块就生效了,而且postconfiguration也会被调用,在回调中设置了回调的链表。最终未被调用,其秘密就藏在了auto/modules这个脚本中

在其中搜索HTTP_FILTER_MODULES,可以看到:

这上面有段注释,说明了,过滤模块的顺序很重要,再往上则是说http模块顺序也很重要。

因此在HTTP_FILTER_MODULES下面有个ngx_module_order对模块进行了排序,这个决定了模块最终在全局变量ngx_modules数组中顺序位置。但是这里有个疑惑,这只是决定了模块在数组中的位置而已,他是如何决定config中加了HTTP_FILTER_MODULES变量后,过滤回调才能被调用的呢?

即,加了HTTP_FILTER_MODULES,你的过滤回调才能被调用,否则不可能。

以header_filter为例,

首先这个顺序是最重要,但是他是如何做到的呢?

答案就在ngx_http_header_filter_module这个模块中,

ngx_http_header_filter_module,是第一个被初始化的过滤模块

我们看其初始化函数:

static ngx_int_t

ngx_http_header_filter_init(ngx_conf_t *cf)

{

    ngx_http_top_header_filter = ngx_http_header_filter;

    return NGX_OK;

}

在这里,最先初始化ngx_http_top_header_filter,之后的模块则都是

xxx_next_header_filter=ngx_http_top_header_filter;

ngx_http_top_header_filter=xxx_header_filter;

依次来形成了回调链表。

如果我们的模块不是HTTP_FILTER_MODULES,那么我们的模块则一定排在ngx_http_header_filter_module之前,因此我们的模块被先初始化,即使我们挂了回调,那么等到调用ngx_http_header_filter_module模块初始化的时,直接重置了ngx_http_top_header_filter,使先前的链表直接失效了。这个排序在configiure执行后,可以在objs/ngx_modules.c可以看到。

nginx这样的设计是比较巧妙,如果你不显示告诉configure你是HTTP_FILTER_MODULES,那么最终程序中你的过滤回调就不会生效。

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

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

相关文章

c语言必备知识-->文件操作(内存与磁盘交互)

引言:本篇文章主要的内容是关于c语言文件相关的知识点,包括相应的代码实操,及文件操作时常用的接口讲解。 本篇文章用来解决如何将内存中的数据永久保存到磁盘当中,并且如何从磁盘读取内容放到我们内存当中。 我将讲解如下知识点: 1:文件(是什么,为什么要用,) 2:常用…

《Spring Cloud Config与Bus整合实现微服务配置自动刷新》

目录 Config与Bus整合自动刷新步骤1:安装RabbitMQ并启动RabbitMQ的安装 步骤2:创建项目创建Eureka Server创建config-server 步骤3: 添加依赖步骤4:Config Client步骤5:测试运行问题一问题二 总结 Config与Bus整合自动…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天,数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言,不仅在企业级应用开发中占据主导地位,也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据,为数据分析、机…

一篇文章带你走进Java集合中的HashMap

文章目录 一、了解常见的数据结构二叉平衡树AVL树红黑树 二、HashMap的实现原理HashMap的jdk1.7和jdk1.8有什么区别? 三、HashMap put的具体流程四、HashMap的扩容机制五、HashMap的寻址算法**第一步:** 计算对象的hashCode第二步: 二次哈希第…

基于springboot的学习平台系统

springbootjava学习平台作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库&#xff1a…

2024第七届全国大学生数学竞赛暨数学精英挑战赛第二场,第一场获奖名单已公布

第七届全国大学生数学竞赛暨数学精英挑战赛(原网络挑战赛)由浙江应用数学研究会组织举办。自2018年起已经连续举办6届,吸引来自全国900余所高校选手参赛,近三年累计参赛人数1.5万人。2024年,第七届全国大学生数学竞赛暨…

力扣MySQL 1581

先把两张表连接,amount为null 的正是我们需要的,再按customer_id聚合 select Visits.visit_id,customer_id ,Transactions.visit_id ,transaction_id ,amount from Visits left join Transactions on Visits.visit_idTransactions.visit_id 正确代码&…

银河麒麟V10系统+Windows10双系统启动顺序正确修改方法

***正确可行方法***,测试OK且稳定; 银河麒麟桌面操作系统V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统,同源支持国内外主流处理器架构,并不断使能GPU、桥片、网卡等各种新硬件,提供更优的软…

Electron+Vue实现两种方式的截屏功能

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中 非electron环境 这个环境下会有一些限制: 1.只能截浏览器中的画面 2.如果里面有iframe或者base64的图片会加载不出来(这个会有解决办法) yarn add -D js-web-scree…

Vue详细入门(语法【三】)

今天滴的学习目标!!! Vue组件是什么?组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门(语法【一】——【二】)当中我们学习了Vue有哪些指令,它的核心语法有哪些?今天我们…

大模型学习方法之——大模型技术学习路线,小白也能学会大模型

技术学习无非涵盖三个方面,理论,实践和应用 大模型技术爆火至今已经有两年的时间了,而且大模型技术的发展潜力也不言而喻。因此,很多人打算学习大模型,但又不知道该怎么入手,因此今天就来了解一下大模型的…

java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2: 小程序代码 webview页面代码 小程序首页代码 3:后端代码 1:增加公众号配置项 2:读取公众号配置项 3&…

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样,下面有情MongoDB来做个自我介绍 大家好,俺是MongoDB,是一个开源、高性能、无模式的文档型数据库,当初的设计俺就是用于简化开…

学习笔记(202410)

课程:Generative AI for Software Development 链接:吴恩达同步最新AI专业课,第54讲:用人工智能做软件开发--Generative AI for Software Development_哔哩哔哩_bilibili 时间:2024-10-12 至 概述:使用C…

强化学习与深度强化学习:深入解析与代码实现

个人主页:chian-ocean 文章专栏 强化学习与深度强化学习:深入解析与代码实现 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过智能体(agent)与环境(environment&am…

【Linux】Linux常见指令及权限理解

1.ls指令 语法 : ls [ 选项 ][ 目录或文件 ] 功能 :对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文…

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用 无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yol…

【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例

上篇文章:Vue】Vue(九)OptionsAPI与CompositionAPI的区别 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日11点13分 文章目录 toRefs()和toRe…

基于朴素贝叶斯的中文垃圾短信分类(含ui界面)

完整代码如下 基于朴素贝叶斯的中文垃圾短信分类、垃圾邮件分类。 可用于机器学习课程设计等。 import warnings warnings.filterwarnings(ignore) import os os.environ["HDF5_USE_FILE_LOCKING"] "FALSE" import pandas as pd import numpy as np fro…

LeetCode1004.最大连续1的个数

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode) 1.常规解法(会超时) 遍历数组,当元素是1时个数加一,当元素是0时且已有的0的个数不超过题目限制时,个数加一,若上…