当前位置: 首页 > news >正文

ngx_http_add_location

声明在 src\http\ngx_http_core_module.c 

ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf);

定义在 src\http\ngx_http.c 

ngx_int_t
ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf)
{ngx_http_location_queue_t  *lq;if (*locations == NULL) {*locations = ngx_palloc(cf->temp_pool,sizeof(ngx_http_location_queue_t));if (*locations == NULL) {return NGX_ERROR;}ngx_queue_init(*locations);}lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));if (lq == NULL) {return NGX_ERROR;}if (clcf->exact_match
#if (NGX_PCRE)|| clcf->regex
#endif|| clcf->named || clcf->noname){lq->exact = clcf;lq->inclusive = NULL;} else {lq->exact = NULL;lq->inclusive = clcf;}lq->name = &clcf->name;lq->file_name = cf->conf_file->file.name.data;lq->line = cf->conf_file->line;ngx_queue_init(&lq->list);ngx_queue_insert_tail(*locations, &lq->queue);if (ngx_http_escape_location_name(cf, clcf) != NGX_OK) {return NGX_ERROR;}return NGX_OK;
}

ngx_http_add_location 函数的作用是将一个新的 location 配置项添加到 Nginx 的 location 队列中,以便后续处理 HTTP 请求时进行匹配


ngx_int_t
ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf)
{ngx_http_location_queue_t  *lq;if (*locations == NULL) {*locations = ngx_palloc(cf->temp_pool,sizeof(ngx_http_location_queue_t));if (*locations == NULL) {return NGX_ERROR;}ngx_queue_init(*locations);}

声明一个指向 ngx_http_location_queue_t 类型的指针 lq,用于后续存储新的 location 配置节点

ngx_http_location_queue_t-CSDN博客

判断传入的 locations 队列是否为空(未初始化)

如果队列未初始化(*locations == NULL),需要为其分配内存并初始化队列结构

此时 *locations=NULL

    lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));if (lq == NULL) {return NGX_ERROR;}

 为新的 location 队列节点分配内存

    if (clcf->exact_match
#if (NGX_PCRE)|| clcf->regex
#endif|| clcf->named || clcf->noname){lq->exact = clcf;lq->inclusive = NULL;} else {lq->exact = NULL;lq->inclusive = clcf;}
  • clcf->exact_match
    表示当前 location 是精确匹配 (如 location = /exact/ {})。
  • clcf->regex
    表示当前 location 使用正则表达式 (如 location ~ ^/regex/ {})。
    • 该条件受 NGX_PCRE 宏控制,仅在编译时启用 PCRE 库时生效。
  • clcf->named
    表示当前 location 是命名 location (如 location @name {}),通常用于内部跳转。
  • clcf->noname
    表示当前 location 是未命名的特殊 location (如 location / {} 的默认配置)

条件判断

如果当前 location 是以下类型之一:

exact_match= 精确匹配)

regex(正则表达式匹配,如 ~~*

named(命名 location,如 location @name

noname(无名 location,如 location {}

则将其标记为 exact 类型(高优先级)。

否则 (进入 else 分支),标记为 inclusive 类型(普通前缀匹配)。

字段赋值

exact = NULL:显式清空高优先级匹配指针。

inclusive = clcf:将当前 location 的配置结构体指针赋给 inclusive,表示这是一个普通前缀匹配的 location

Nginx 在路由请求时

按优先级顺序匹配 (精确匹配 > 正则匹配 > 普通前缀匹配)

此时 exact_match=0    regex=NULL   named=0    noname=0

    lq->name = &clcf->name;lq->file_name = cf->conf_file->file.name.data;lq->line = cf->conf_file->line;
 lq->name = &clcf->name;
  • 作用 :将 lqname 指针指向当前 location 配置的名称(clcf->name)。
  • 意义
    • clcf->namengx_str_t 类型,存储了 location 的匹配规则(如 /api~ ^/regex)。
    • 通过 lq->name 可以直接访问该名称,用于请求匹配时的调试输出 日志记录 (例如记录命中了哪个 location)。
 lq->file_name = cf->conf_file->file.name.data;
  • 作用 :将 lqfile_name 指向当前解析的配置文件路径(如 /etc/nginx/conf.d/default.conf)。
  • 意义
    • cf->conf_file->file.name.data 是一个字符串,表示当前解析的配置文件路径。
    • 在出现配置错误(如重复 location 或语法错误)时,Nginx 可以通过 file_name 定位到具体的配置文件 ,方便用户快速排查问题。
 lq->line = cf->conf_file->line;
  • 作用 :将 lqline 设置为当前解析的配置文件行号。
  • 意义
    • cf->conf_file->line 是一个整数,表示当前解析到的配置文件行号。
    • 结合 file_name,可以在错误日志中精确标识配置的位置 (例如 nginx.conf:15),提升调试效率。

此时

lq->name->data=/
lq->file_name=/home/wsd/桌面/nginx/conf/nginx.conf
lq->line=43 

    ngx_queue_init(&lq->list);

 初始化 ngx_http_location_queue_t 节点内部的子队列

若配置中存在嵌套的 location(如 location /parent { location /child {} }),父 location 的 list 可用于链接子节点

    ngx_queue_insert_tail(*locations, &lq->queue);

 将新节点添加到队列的末尾

    if (ngx_http_escape_location_name(cf, clcf) != NGX_OK) {return NGX_ERROR;}

 

  • 调用转义函数
    ngx_http_escape_location_name(cf, clcf)clcf->name(location 的名称)进行 URI 转义。
  • 错误检查
    如果转义失败(返回值非 NGX_OK),立即终止当前配置解析,返回 NGX_ERROR

ngx_http_escape_location_name-CSDN博客

return NGX_OK;

 返回 NGX_OK

相关文章:

ngx_http_add_location

声明在 src\http\ngx_http_core_module.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf); 定义在 src\http\ngx_http.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http…...

深入探索ArkUI中的@LocalBuilder装饰器:构建高效可维护的UI组件

在ArkUI框架中,组件化开发是提升代码复用性和维护性的关键手段。随着项目复杂度的增加,开发者常常面临如何在保持组件封装性的同时,灵活处理组件内部逻辑的问题。传统的Builder装饰器虽然提供了强大的自定义构建能力,但在某些场景…...

视频知识库初步设想

将视频字幕提取出来作为知识库来源定位,下一步设想:把视频上的图片信息也精简出来作为定位。 下面是测试例子: 入参: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…...

微信小程序中使用Less样式方法

在微信小程序中使用Less样式,可以通过以下步骤实现。主要原理是借助Visual Studio Code(VSCode)的插件将Less文件自动编译为小程序支持的.wxss文件,或通过微信开发者工具的扩展功能直接集成Less编译环境。以下是具体方法&#xff…...

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...

本周安全速报(2025.3.18~3.24)

合规速递 01 2025欧洲网络安全报告:DDoS攻击同比增长137%,企业应如何应对? 原文: https://hackread.com/european-cyber-report-2025-137-more-ddos-attacks/ 最新的Link11《欧洲网络安全报告》揭示了一个令人担忧的趋势:DDo…...

力扣刷题-热题100题-第23题(c++、python)

206. 反转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 记录前一个指针,当前指针&am…...

YAML是什么?

YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析: 1. 定义与历史演变 全称与定位: YAML的全称最初为“Yet…...

期权交易投资怎么操作?新手期权操作指南

期权就是股票,唯一区别标的物上证指数,会看大盘吧,新手做期权交易两个方向认购做多,认沽做空,双向t0交易没了,跟期货一样,对的,玩的也是合约,唯一区别没有保证金不会爆仓…...

音视频学习(三十):fmp4

FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming&#xf…...

破局AI落地困局 亚信科技“四位一体手术刀“切开产业智能三重枷锁

当全球进入以AI为核心竞争力的新经济周期,政企机构的数字化转型正面临关键转折点:IDC数据显示,2023年超过67%的中国企业在AI落地环节遭遇"技术断层",高昂的试错成本与碎片化解决方案让智能转型陷入僵局。在此背景下&…...

android 去掉状态栏的方法汇总

在 Android 开发中,隐藏或去除状态栏(Status Bar)有多种方法,具体实现方式取决于应用场景和目标 Android 版本。以下是常用的 ​6 种方法及其代码示例: 在 Android 开发中,隐藏或去除状态栏(Sta…...

jenkins+1panel面板java运行环境自动化部署java项目

本文章不包含1panel面板安装、jenkins部署、jenkins连接git服务器等操作教程,如有需要可以抽空后期补上 jenkins安装插件Publish Over SSH 在系统配置添加服务器 查看项目的工作空间 项目Configure->构Post Steps选择Send files or execute commands over SSH…...

VLAN综合实验报告

一、实验拓扑 网络拓扑结构包括三台交换机(LSW1、LSW2、LSW3)、一台路由器(AR1)以及六台PC(PC1-PC6)。交换机之间通过Trunk链路相连,交换机与PC、路由器通过Access或Hybrid链路连接。 二、实验…...

雷军从 6 楼扔涂有防弹涂层西瓜,西瓜完好无损,这种防弹涂层是什么材质?用在车上效果怎么样?

雷军展示的“防弹涂层”是一种基于第四代高分子材料聚脲(Polyurea)的升级技术,其核心特性是通过纳米级交联结构形成弹性防护层,兼具柔韧性与刚性,能够有效吸收冲击能量并抵御尖锐物体的穿刺。以下是关于该涂层材质及在…...

信奥赛CSP-J复赛集训(模拟算法专题)(31):P2692 覆盖

信奥赛CSP-J复赛集训(模拟算法专题)(31):P2692 覆盖 题目背景 WSR 的学校有 B B B 个男生和 G G G 个女生都来到一个巨大的操场上扫地。 题目描述 操场可以看成是 N N N 行 M M M 列的方格矩阵,如下…...

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server)

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 这个查询结果创建一个新表&am…...

【Go】结构体的基本使用

go语言不是面向对象的语言 但是结构体类似于面向对象 结构体的定义 package mainimport "fmt"type Student struct {id intname stringage intschool string }func main() {s : Student{1, "luobozi", 18, "znl"}fmt.Println(s) }结构…...

统计可重复列表中的TOP N

文章目录 方案1:HashMap统计 全排序实现步骤:代码实现:优缺点: 方案2:HashMap统计 最小堆(优先队列)实现步骤:代码实现:优缺点: 方案3:Java Str…...

《jQuery Mobile 页面:深入解析与优化实践》

《jQuery Mobile 页面:深入解析与优化实践》 引言 jQuery Mobile 是一个流行的前端框架,专为移动设备设计,提供了丰富的UI组件和简洁的API,使得开发者可以快速构建出美观且响应式的移动页面。本文将深入解析jQuery Mobile的页面构建方法,并探讨一些优化实践,以帮助开发…...

C#中 String类API(函数)

字符串属性 string str "打工人";Console.WriteLine(str);char s str[0];Console.WriteLine(s); 字符串内置API(函数) 1. Concat 拼接字符串 string s1 "打";string s2 "工";string s3 "人";string sthstring.Concat(s1, s2, s…...

【Linux 维测专栏 5 -- linux pstore 使用介绍】

文章目录 Linux pstore 功能简介1. pstore 概述2. pstore 的核心功能3. pstore 的工作原理4. pstore 的使用示例5. pstore 的优势6. 典型应用场景配置示例1)DTS配置2)config配置运行测试及log问题小结Linux pstore 功能简介 1. pstore 概述 pstore(Persistent Storage)是…...

AI赋能:科技写作的革新之路

在当今数字化时代,人工智能(AI)技术正以惊人的速度渗透到各个领域,科技写作也不例外。AI不仅改变了写作的方式,还极大地提升了写作的效率和质量。本文将探讨AI技术在科技写作中的应用,并分享一些实用的AI工…...

如何为你的github开源项目选择合适的开源协议?

如何为你的github开源项目选择合适的开源协议? 导言 在github开源世界中,选择一个合适的开源协议是至关重要的。它不仅定义了他人如何使用你的代码,还决定了你的项目能否被广泛接受和传播,还能避免侵权问题。 然而,面…...

struts2漏洞攻略

S2-057远程执行代码漏洞 靶场: /struts2/s2-057 1,搭建好环境后访问 http://47.108.150.249:8081/struts2-showcase/ 2,在url处进行输⼊ 在url输入http://47.108.150.249:8081/struts2-showcase/${(123123)}/actionChain1.action 后刷新可…...

LVGL学习1

LVGL知识点 架构图 参考:Getting Started — LVGL documentation display、screen、widget的关系 参考: Widget Basics — LVGL documentation Overview — LVGL documentation 简单说,display就是硬件的显示设备,也就是一个一…...

【SpringCloud】微服务的治理以及服务间的远程调用

目录 一、微服务的诞生 二、服务注册和发现 2.1 需求的产生 2.2 注册中心原理 2.3 Nacos注册中心 2.4 Nacos安装部署教程 2.5 配置Nacos 三、OpenFeign 3.1 认识OpenFeign 3.2 快速入门 3.2.1 引入依赖 3.2.2 启动OpenFeign 3.2.3 编写OpenFeign客户端 3.2.4 使…...

钞票准备好了吗?鸿蒙电脑 5 月见

3月20日,在华为 Pura 先锋盛典及鸿蒙智行新品发布会上,华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东表示,华为终端全面进入鸿蒙时代,今年5月将推出鸿蒙电脑。 在3月20日的华为Pura先锋盛典及鸿蒙智行新品发布会上…...

【2025】基于springboot+uniapp的企业培训打卡小程序设计与实现(源码、万字文档、图文修改、调试答疑)

基于 Spring Boot uniapp 的企业培训打卡小程序设计与实现 系统功能结构图如下: 一、课题背景 在当今快节奏的商业环境中,企业培训对于员工的成长和企业的发展至关重要。为了满足企业对高效培训管理和员工便捷学习的需求,基于 Spring Boot …...

poetry安装与使用

文章目录 安装方法虚拟环境构建方法* 创建新虚拟环境【新环境使用】* 使用仓库拉取的代码构建虚拟环境【远端仓库拉取使用】 常用命令注意事项 安装方法 安装命令(全局安装,不要在虚拟环境中安装,方便后面创建环境使用) pip3 inst…...

聊聊langchain4j的Code Execution Engine

序 本文主要研究一下langchain4j的Code Execution Engine 步骤 pom.xml <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-code-execution-engine-graalvm-polyglot</artifactId><version>1.0.0-beta2</ver…...

军事级加密通信系统——基于QML的战术地图加密传输

目录 基于QML的战术地图加密传输一、引言二、理论背景与安全需求2.1 战术地图数据的敏感性与安全性要求2.2 QML与PyQt5集成优势2.3 加密算法与数据传输模型三、系统架构与数据流图四、QML前端界面设计与交互功能4.1 QML界面优势与设计理念4.2 功能要求4.3 QML文件示例五、加密传…...

ffmpeg系列(三)—— 音频重采样

SwrContext 一、SwrContext 的重要字段 SwrContext 是音频重采样的核心配置对象&#xff0c;其关键字段决定了重采样的行为和性能。以下是常用字段及其作用&#xff1a; 字段名称类型作用典型值示例in_sample_rateint输入音频的采样率&#xff08;Hz&#xff09;。44100out_…...

android Kotlin原理

目录 一,概述 1.1 kotlin协程序原理: 1.2 核心概念 二,协程调度器之Dispatchers 三,协程能进行线程恢复的原理 一,概述 1.1 kotlin协程序原理: 1,内部线程池管理线程使用到了自旋和挂起 2,传统的线程之所以重,是因为线程的执行&#xff0c;等待唤醒需要操作系统来完成 …...

MyBatis-Plus(Ⅲ)IService详解

目录 一、逐一演示 1.save&#xff08;插入一条&#xff09; 结果 断言&#xff08;引入概念&#xff09; 2.saveBatch&#xff08;批量插入&#xff09; 结果 3.saveOrUpdateBatch&#xff08;批量插入&更新&#xff09; 结果 4.removeById&#xff08;通过id删除…...

2024年认证杯SPSSPRO杯数学建模C题(第二阶段)云中的海盐全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现&#xff1a; 巴黎气候协定提出的目标是&#xff1a;在2100年前&#xff0c;把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平&#xff0c;并为1.5摄氏度而努力。但事实上&#xff0c;许多之前的…...

PostgreSQL 存储过程

简介 PostgreSQL 中的存储过程&#xff08;Stored Procedure&#xff09;是一种在数据库中定义的可重复使用的程序单元&#xff0c;用于封装复杂的业务逻辑和数据处理操作 示例 简单示例 创建存储过程 CREATE PROCEDURE insert_users (user_account TEXT, hashed_password…...

GGUF 和 llama.cpp 是什么关系

这是个非常关键的问题&#xff0c;咱们来细说下&#xff1a;GGUF 和 llama.cpp 是什么关系&#xff0c;它们各自干什么&#xff0c;如何配合工作。 &#x1f527; 一、llama.cpp 是什么&#xff1f; llama.cpp 是 Meta 的开源大语言模型 LLaMA&#xff08;Language Model from…...

(UI自动化测试web端)第二篇:元素定位的方法_class定位

看代码里的【 driver.find_element_by_class_name( )】()里的路径怎么写&#xff1f; 那我们现在说的就是在元素定位时&#xff0c;根据网页的实际情况来选择适合的元素定位的写法。文章主要介绍了class定位在正常工作当中的使用。 第三种定位 方式&#xff1a;class定位 ⽅法…...

闲聊IT - 面向服务架构(SOA)的发展历史

SOA的发展历史 面向服务架构&#xff08;SOA&#xff09;是随着企业信息化进程的发展逐渐形成的&#xff0c;它的出现是为了应对传统软件架构在现代企业复杂需求面前的局限性。SOA的起源和发展过程可以追溯到20世纪90年代末期&#xff0c;并随着互联网技术的普及、分布式计算以…...

31天Python入门——第9天:再学函数

你好&#xff0c;我是安然无虞。 文章目录 再学函数1. 变量在函数中的作用域2. 函数的参数传递.补充学习: 不定长参数*args和**kwargs 3. 值传递和引用传递补充学习: 把函数作为参数传递 4. 匿名函数5. python中内置的常用函数zip()map()filter()all()any() 6. 函数练习 再学函…...

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…...

如何分析和解决服务器的僵尸进程问题

### 如何分析和解决服务器的僵尸进程问题 #### **一、僵尸进程的定义与影响** **僵尸进程&#xff08;Zombie Process&#xff09;** 是已终止但未被父进程回收资源的进程。其特点&#xff1a; - **状态标识**&#xff1a;在进程列表&#xff08;如 ps 或 top&#xff09;中标…...

Kafka分区分配策略详解

Kafka分区分配策略详解 Kafka作为当前最流行的分布式消息队列系统&#xff0c;其分区分配策略直接影响着系统的性能、可靠性和可扩展性。合理的分区分配不仅能够提高数据处理的效率&#xff0c;还能确保系统负载的均衡。 Kafka提供了多种内置的分区分配策略&#xff0c;包括R…...

Vs code搭建uniapp-vue项目

安装vue环境npm install -g vue/clinode版本建议18或者18以上 vue create -p dcloudio/uni-preset-vue 项目名称----正式版vue create -p dcloudio/uni-preset-vue#alpha 项目名称----alpha版Vue3/Vite版 npx degit dcloudio/uni-preset-vue#vite 项目名称---js-正式版npx degi…...

cursor常用快捷键(JetBrains Darcula主题风格)

一、基础操作速查 打开/创建项目 打开项目&#xff1a;Ctrl Shift O&#xff08;选择文件夹&#xff09;新建文件&#xff1a;Ctrl N保存文件&#xff1a;Ctrl S关闭当前标签页&#xff1a;Ctrl F4 代码编辑 复制当前行&#xff1a;Ctrl D删除当前行&#xff1a;Ctrl …...

easyExcel2.2.10中为0数据显示为空

在 EasyExcel 2.2.10 中&#xff0c;如果希望将数值为 0 的数据在 Excel 中显示为空&#xff08;即不显示 0&#xff09;&#xff0c;可以通过以下方法实现&#xff1a; 1. 使用 ExcelProperty 的 format 参数 通过设置单元格格式为 #&#xff08;# 会忽略 0&#xff09;&…...

Walrus 经济模型 101

本文作者&#xff1a;Steve_4P&#xff0c;文章仅代表作者观点。 要点总结 2025 年 3 月 20 日&#xff0c;Walrus 基金会宣布成功融资 约 1.4 亿美元&#xff0c;投资方包括 Standard Crypto、a16z 等机构。Walrus 当前估值约 20 亿美元&#xff0c;其中 7% 代币供应量分配给…...

WordPress二次开发中常用到的一些变量和函数

WordPress是一个开源的博客软件平台&#xff0c;由于其强大的功能和灵活性&#xff0c;被广泛用于各种网站的建设。对于开发者来说&#xff0c;了解并掌握WordPress中的常用变量和函数是非常重要的。在WordPress二次开发中&#xff0c;以下是一些常用的变量和函数&#xff1a; …...

【视频】OpenCV:色彩空间转换、灰度转伪彩

1、颜色空间转换 使用OpenCV的函数 cv::applyColorMap 可以将灰度或者正常的RGB格式图片,转换成其它伪彩色,代码很简单: 1)使用 cv::imread 加载图片; 2)使用 std::vector<cv::Mat> matrices 暂存转换后的所有图像; 3)使用 cv::applyColorMap 转换图片颜色; 4)…...