ngx_http_index_set_index

server/2025/3/31 7:52:30/

定义在 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 

 


 


http://www.ppmy.cn/server/179845.html

相关文章

【C++进阶】函数:深度解析 C++ 函数的 12 大进化特性

目录 一、函数基础 1.1 函数定义与声明 1.2 函数调用 1.3 引用参数 二、函数重载&#xff1a;同名函数的「多态魔法」&#xff08;C 特有&#xff09; 2.1 基础实现 2.2 重载决议流程图 2.3 与 C 语言的本质区别 2.4 实战陷阱 三、默认参数&#xff1a;接口的「弹性设…

北理工计算机考研复试上机2024年真题

1、输入一组单词(区分大小写),统计首字母相同的单词的个数&#xff0c;相 同的单词不累加&#xff0c;输出格式:“字母&#xff0c;个数” input: I am a boy,you are a boy. output: I,1 a,3 b,1 y,1 代码&#xff1a; #include <bits/stdc.h> using namespace…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

目录 1. sizeof 和 strlen的区别 1.1 sizeof 1.2 strlen 2. 数组和指针习题解析 2.1 一维数组 2.2 字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3: 代码4&#xff1a; 代码5&#xff1a; 代码6&#xff1a; 2.3 二维数组 3. 指针运算笔试题解析 3.1 3.…

RabbitMQ 学习整理1 - 基础使用

项目代码&#xff1a;RabbitMQDemo: 学习RabbitMQ的一些整理 基本概念 RabbitMQ是一种基于AMQP协议的消息队列实现框架RabbitMQ可以用于在系统与系统之间或者微服务节点之间&#xff0c;进行消息缓存&#xff0c;消息广播&#xff0c;消息分配以及限流消峰处理RabbitMQ-Serve…

云端存储新纪元:SAN架构驱动的智能网盘解决方案

一、企业存储的"不可能三角"破局 1.1 传统存储架构的困局 性能瓶颈&#xff1a;NAS架构在1000并发访问时延迟飙升300%容量限制&#xff1a;传统RAID扩容需停机维护&#xff0c;PB级存储扩展耗时超48小时成本矛盾&#xff1a;全闪存阵列每TB成本高达$3000&#xff0…

在 Ubuntu 上安装 Docker 的完整指南

1. 卸载旧版本(如有) 在安装新版本前,建议先卸载旧版本: sudo apt remove docker docker-engine docker.io containerd runc 2. 安装依赖包 更新软件包索引并安装必要的依赖: sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release 3. 添加 Do…

Spring Boot集成阿里云OSS:对象存储实战指南

Spring Boot集成阿里云OSS&#xff1a;对象存储实战指南 1. OSS是什么&#xff1f;为什么选择阿里云OSS&#xff1f; 对象存储&#xff08;OSS&#xff09; 是一种用于存储非结构化数据&#xff08;如图片、视频、日志文件&#xff09;的云服务&#xff0c;核心功能包括&#…

mapbox进阶,仿照百度,加载marker点位,移入marker点切换图标,点击展示气泡,气泡和marker联动

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️marker 标注点位 api1.3.1 ☘️构造函数…