ngx_http_index_set_index
定义在 src\http\modules\ngx_http_index_module.c
static char *
ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ngx_http_index_loc_conf_t *ilcf = conf;ngx_str_t *value;ngx_uint_t i, n;ngx_http_index_t *index;ngx_http_script_compile_t sc;if (ilcf->indices == NULL) {ilcf->indices = ngx_array_create(cf->pool, 2, sizeof(ngx_http_index_t));if (ilcf->indices == NULL) {return NGX_CONF_ERROR;}}value = cf->args->elts;for (i = 1; i < cf->args->nelts; i++) {if (value[i].data[0] == '/' && i != cf->args->nelts - 1) {ngx_conf_log_error(NGX_LOG_WARN, cf, 0,"only the last index in \"index\" directive ""should be absolute");}if (value[i].len == 0) {ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,"index \"%V\" in \"index\" directive is invalid",&value[1]);return NGX_CONF_ERROR;}index = ngx_array_push(ilcf->indices);if (index == NULL) {return NGX_CONF_ERROR;}index->name.len = value[i].len;index->name.data = value[i].data;index->lengths = NULL;index->values = NULL;n = ngx_http_script_variables_count(&value[i]);if (n == 0) {if (ilcf->max_index_len < index->name.len) {ilcf->max_index_len = index->name.len;}if (index->name.data[0] == '/') {continue;}/* include the terminating '\0' to the length to use ngx_memcpy() */index->name.len++;continue;}ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));sc.cf = cf;sc.source = &value[i];sc.lengths = &index->lengths;sc.values = &index->values;sc.variables = n;sc.complete_lengths = 1;sc.complete_values = 1;if (ngx_http_script_compile(&sc) != NGX_OK) {return NGX_CONF_ERROR;}}return NGX_CONF_OK;
}
ngx_http_index_set_index函数是 Nginx 中处理index配置指令的核心逻辑
if (ilcf->indices == NULL) {ilcf->indices = ngx_array_create(cf->pool, 2, sizeof(ngx_http_index_t));if (ilcf->indices == NULL) {return NGX_CONF_ERROR;}}
通过
ilcf->indices == NULL判断当前配置块的indices数组是否未被初始化
ilcf->indices是 Nginx 中用于 存储index指令配置的索引文件列表 的核心数据结构它是一个动态数组(
ngx_array_t类型),每个元素是ngx_http_index_t结构体,表示一个索引文件(如index.html)ngx_http_index_loc_conf_t-CSDN博客
ngx_http_index_t-CSDN博客
此时
ilcf->indices= NULL
进入这个条件
value = cf->args->elts;for (i = 1; i < cf->args->nelts; i++) {if (value[i].data[0] == '/' && i != cf->args->nelts - 1) {ngx_conf_log_error(NGX_LOG_WARN, cf, 0,"only the last index in \"index\" directive ""should be absolute");}
校验
index指令参数的合法性 ,确保绝对路径的索引文件(以/开头)只能作为最后一个参数
- Nginx 按顺序检查索引文件,一旦找到匹配的文件即停止搜索。
- 绝对路径通常指向固定位置,作为“最终回退选项”更合理。
- 如果绝对路径出现在中间参数,可能导致后续参数被忽略,引发配置逻辑错误
if (value[i].len == 0) {ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,"index \"%V\" in \"index\" directive is invalid",&value[1]);return NGX_CONF_ERROR;}
校验
index指令中每个索引文件名的合法性 ,确保文件名非空
index = ngx_array_push(ilcf->indices);if (index == NULL) {return NGX_CONF_ERROR;}
在
ilcf->indices数组末尾分配一个新元素
index->name.len = value[i].len;index->name.data = value[i].data;index->lengths = NULL;index->values = NULL;
设置新元素的各个字段
index->name.len = value[i].len; // (1) 复制文件名长度
index->name.data = value[i].data; // (2) 复制文件名数据指针
index->lengths = NULL; // (3) 标记无需动态长度计算
index->values = NULL; // (4) 标记无需动态值生成
n = ngx_http_script_variables_count(&value[i]);
统计
index指令参数中变量的数量此时 n=0
if (n == 0) {if (ilcf->max_index_len < index->name.len) {ilcf->max_index_len = index->name.len;}if (index->name.data[0] == '/') {continue;}/* include the terminating '\0' to the length to use ngx_memcpy() */index->name.len++;continue;}
if (n == 0) { // (1) 确认为静态文件名(无变量)
// (2) 更新最大文件名长度
if (ilcf->max_index_len < index->name.len) {
ilcf->max_index_len = index->name.len;
}// (3) 跳过绝对路径的特殊处理
if (index->name.data[0] == '/') {
continue;
}// (4) 包含终止符 '\0' 的长度调整
index->name.len++;continue; // (5) 跳出循环,避免动态编译逻辑
}
2次 continue 然后循环结束
return NGX_CONF_OK;
返回 NGX_CONF_OK
相关文章:
ngx_http_index_set_index
定义在 src\http\modules\ngx_http_index_module.c static char * ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_index_loc_conf_t *ilcf conf;ngx_str_t *value;ngx_uint_t i, n;ngx_http_inde…...
怎样实现CAN数据的接收和发送?
在裸机环境下实现CAN数据的接收和发送,需要通过 硬件寄存器操作 或 HAL库函数 结合 手动实现的队列 来完成。以下是完整的接收和发送流程实现: 1. 硬件初始化 首先初始化CAN控制器和GPIO: void CAN_Init(void) {// 1. 使能CAN时钟__HAL_RCC…...
Linux笔记---动静态库(使用篇)
目录 1. 库的概念 2. 静态库(Static Libraries) 2.1 静态库的制作 2.2 静态库的使用 2.2.1 显式指定库文件及头文件路径 2.2.2 将库文件安装到系统目录 2.2.3 将头文件安装到系统目录 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 3.2.1 显式…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
基于 ffmpeg 实现合并视频
ffmpeg是一个强大的多媒体处理工具,支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…...
手机销售终端MPR+LTC项目项目总体方案P183(183页PPT)(文末有下载方式)
资料解读:手机销售终端 MPRLTC 项目项目总体方案 详细资料请看本解读文章的最后内容。在当今竞争激烈的市场环境下,企业的销售模式和流程对于其发展起着至关重要的作用。华为终端正处于销售模式转型的关键时期,波士顿 - 华为销售终端 MPRLTC …...
【Python LeetCode Patterns】刷力扣,15 个学习模式总结
1. 前缀和(Prefix Sum)—— 查询子数组中元素和303. 区域和检索 - 数组不可变304. 二维区域和检索 - 矩阵不可变 2. 双指针(Two Pointers)—— 移向彼此或远离彼此3. 滑动窗口(Sliding Window)—— 找到满足…...
蓝桥杯单片机刷题——串口发送显示
设计要求 通过串口接收字符控制数码管的显示,PC端发送字符A,数码管显示A,发送其它非法字符时,数码管显示E。 数码管显示格式如下: 备注: 单片机IRC振荡器频率设置为12MHz。 串口通信波特率:…...
DeepSeek V3-0324升级:开启人机共创新纪元
一、技术平权:开源协议重构AI权力格局 DeepSeek V3选择MIT协议开源6850亿参数模型,本质上是一场针对技术垄断的“数字起义”。这一决策的深层影响在于: 商业逻辑的重构 闭源AI公司依赖API收费的商业模式面临根本性挑战。当顶级模型能力可通过…...
探索抓包利器ProxyPin,实现手机APP请求抓包,支持https请求
以下是ProxyPin的简单介绍: - ProxyPin是一个开源免费HTTP(S)流量捕获神器,支持 Windows、Mac、Android、IOS、Linux 全平台系统- 可以使用它来拦截、检查并重写HTTP(S)流量,支持捕获各种应用的网络请求。ProxyPin基于Flutter开发࿰…...
K8S接口请求过程
K8S接口请求过程 1. 宿主机IP (Host IP)2. Service IP3. NodePort4. Pod端口 (Pod Port)5. 容器端口 (Container Port)6. 应用端口 (Application Port)例子:外部流量如何进入应用配置流量路径表详细说明补充说明--连通性测试: 在Kubernetes(k…...
文献学习:单细胞+临床+模型构建 | 一篇Molecular Cancer文献如何完整解读CDK4/6i耐药机制
👋 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论! 📌一、研究背景:CDK4/6i 是不是“万无一失”? HR/HER2- 是最常见的乳腺癌亚型,占比超过70%。近年来,随…...
3.26前端模拟面试
包含 Vue 3、TypeScript、性能优化、工程化等方面,偏八股文。 基础知识 Vue 3 响应式原理:Vue 3 如何实现响应式系统?Proxy 和 Reflect 的作用是什么? TypeScript 类型体操:实现一个 TypeScript 类型 DeepPartial&am…...
Python SciPy面试题及参考答案
目录 什么是 SciPy?它与 NumPy 有什么区别? 如何在 Python 中安装 SciPy? 如何导入 SciPy 库? SciPy 中有哪些子模块?简要介绍它们的功能。 如何使用 SciPy 进行数值积分?请举例说明。 SciPy 中提供了哪些求解微分方程的函数? 什么是插值?SciPy 中如何进行插值?…...
数据库——MySQL基础
一、建立数据库 新建 create 删除 drop 修改 alter 数据库 database 数据表 table 建数据表 create table stu( 字段名 类型 [ 约束 ] [ 主键 ] [注释] ); 二、数据类型 数字 整数 tinyint (小型数据)一般用来做状态…...
Jetpack LiveData 使用与原理解析
一、引言 在 Android 开发中,数据的变化需要及时反映到界面上是一个常见的需求。然而,传统的方式可能会导致代码复杂、难以维护,并且容易出现内存泄漏等问题。Jetpack 组件中的 LiveData 为我们提供了一种优雅的解决方案,它是一种…...
HarmonyOS Next~鸿蒙系统开发类Kit深度解析与应用实践
HarmonyOS Next~鸿蒙系统开发类Kit深度解析与应用实践 鸿蒙系统(HarmonyOS)凭借其分布式架构和全场景能力,为开发者提供了丰富的开发类Kit。本文将从安全、网络、基础功能、硬件及调测五大类Kit展开,深入探讨其核心技…...
网盘解析工具更新,解决了一些bug
解析工具v1.2.1版本更新,本次是小版本更新,修复了一些bug。 之前小伙伴反应的网盘进入文件后不能返回上一级,现在这个bug修复了,已经可以点击了。 点击资源后会回到资源那一级目录,操作上是方便了不少。 增加了检查自…...
SQL语句及其应用(上) (DDL语句以及DML语句)
SQL语句的定义: 概述: 全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的. 分类: DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD) 涉及到的关键字: create, drop, …...
混境之地1
问题描述 小蓝有一天误入了一个混境之地。 好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息: 混境之地的大小为 n⋅mn⋅m,其中 # 表示这个位置很危险,无法通行,. 表示道路,可以通行。他…...
5种生成模型(VAE、GAN、AR、Flow 和 Diffusion)的对比梳理 + 易懂讲解 + 代码实现
目录 1 变分自编码器(VAE) 1.1 概念 1.2 训练损失 1.3 VAE 的实现 2 生成对抗网络(GAN) 2.1 概念 2.2 训练损失 a. 判别器的损失函数 b. 生成器的损失函数 c. 对抗训练的动态过程 2.3 GAN 的实现 3 自回归模型&am…...
doris:查询熔断
查询熔断是一种保护机制,用于防止长时间运行或消耗过多资源的查询对系统产生负面影响。当查询超过预设的资源或时间限制时,熔断机制会自动终止该查询,以避免对系统性能、资源使用以及其他查询造成不利影响。这种机制确保了集群在多用户环境下…...
多级缓存和数据一致性问题
一、什么是多级缓存? 多级缓存是一种分层的数据缓存策略,通过在不同层级(如本地、分布式、数据库)存储数据副本,结合各层缓存的访问速度和容量特性,优化系统的性能和资源利用率。其核心思想是让数据尽可能…...
计算机期刊推荐 | 计算机-人工智能、信息系统、理论和算法、软件工程、网络系统、图形学和多媒体, 工程技术-制造, 数学-数学跨学科应用
Computers, Materials & Continua 学科领域: 计算机-人工智能、信息系统、理论和算法、软件工程、网络系统、图形学和多媒体, 工程技术-制造, 数学-数学跨学科应用 期刊类型: SCI/SSCI/AHCI 收录数据库: SCI(SCIE),EI,Scopus,知网(CNK…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
【教学类-58-14】黑白三角拼图12——单页1页图。参考图1页6张(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格2-10、张数6张,适合集体操作)
背景需求: 基于以下两个代码,设计一个单页1页黑白三角、彩色三角(包含黑点、白点、无点)的代码。 【教学类-58-12】黑白三角拼图10(N张参考图1张操作卡多张彩色白块,适合个别化)-CSDN博客文章…...
C++项目:高并发内存池_下
目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…...
消息队列性能比拼: Kafka vs RabbitMQ
本内容是对知名性能评测博主 Anton Putra Kafka vs RabbitMQ Performance 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 简介 在本视频中,我们将首先比较 Apache Kafka 和传统的 RabbitMQ。然后,在第二轮测试中,会将 Kaf…...
AP 场景架构设计(一) :OceanBase 读写分离策略解析
说明:本文内容对应的是 OceanBase 社区版,架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见: 官网链接。 概述 当两种类型的业务共同运行在同一个数据库集群上时,这对数据库的配置等条件提出了较高…...
Java 大视界 -- Java 大数据在智能金融区块链跨境支付与结算中的应用(154)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
