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 = valuei.len; // (1) 复制文件名长度
index->name.data = valuei.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.data0 == '/') {
continue;
}

// (4) 包含终止符 '\0' 的长度调整
index->name.len++;

continue; // (5) 跳出循环,避免动态编译逻辑
}

2次 continue 然后循环结束

复制代码
return NGX_CONF_OK;

返回 NGX_CONF_OK


相关推荐
難釋懷33 分钟前
Nginx使用sticky模块完成对Nginx的负载均衡
运维·nginx·负载均衡
難釋懷1 小时前
Nginx水平扩展
运维·nginx
2401_834636995 小时前
Linux 负载均衡全实战:Nginx+HAProxy+LVS 从原理到落地
linux·nginx·负载均衡
杨了个杨898213 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
李白的天不白1 天前
服务器地址在哪里 pwd
运维·前端·nginx
snow@li1 天前
nginx:详解与速查表 / Nginx = 反向代理 + 负载均衡 + 静态服务器 + HTTP 缓存 / 请求分发、静态加速、上线不中断
linux·服务器·nginx
前端程序猿i2 天前
Nginx 教程:从入门到能上线
运维·nginx
明辰之林2 天前
Nginx 1.26.2 → 1.30.2 升级指南(离线环境)
nginx
小云小白2 天前
企业抗量子落地指南(一)全链路抗量子 TLS1.3 落地指南(浏览器 → Nginx → SpringBoot)
spring boot·nginx·抗量子通信
tobias.b2 天前
JumpServer4\.10\.16离线部署\+外部Nginx反向代理 解决30分钟空闲断开WebSocket超时(延长10天)
运维·websocket·nginx