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?

?


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫的視圖有什么用?

數據庫的視圖&#xff08;View&#xff09;是一種虛擬表&#xff0c;它的內容由查詢定義&#xff0c;并不實際存儲數據&#xff0c;而是動態生成。視圖的主要作用如下&#xff1a; 1. 簡化復雜查詢 場景&#xff1a;當查詢涉及多表連接、復雜過濾或聚合操作時&#xff0c;SQL …

Ubuntu 24.04 安裝 Docker 詳細教程

前言 Docker 是目前最流行的容器化技術&#xff0c;它可以幫助開發者快速部署和運行應用程序。本文將詳細介紹在 Ubuntu 24.04 (Noble Numbat) 上安裝 Docker 的完整步驟&#xff0c;包括配置鏡像加速等實用技巧。 一、準備工作 1.1 系統要求 Ubuntu 24.04 LTS 具有 sudo 權…

鴻蒙進行視頻上傳,使用 request.uploadFile方法

一.拉起選擇器進行視頻選擇&#xff0c;并且創建文件名稱 async getPictureFromAlbum() {// 拉起相冊&#xff0c;選擇圖片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…

C++ map容器總結

map基本概念 簡介&#xff1a; map中所有元素都是pair pair中第一個元素為key&#xff08;鍵值&#xff09;&#xff0c;起到索引作用&#xff0c;第二個元素為value&#xff08;實值&#xff09; 所有元素都會根據元素的鍵值自動排序 本質&#xff1a; map/multimap屬于關…

【Zookeeper搭建(跟練版)】Zookeeper分布式集群搭建

&#xff08;一&#xff09;克隆前的準備 1. 用 xftp 發送文件 2. 時間同步&#xff1a; sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 3. zookpeeper 安裝 部署 呼應開頭發送的壓縮包&#xff0c;解壓&#xff1a; cd ~ tar -zxvf zookeeper-3.4.6.tar.g…

Flutter項目之頁面實現以及路由fluro

目錄&#xff1a; 1、項目代碼結構2、頁面編寫以及路由配置main.dart(入口文件)page_content.dartindex.dart&#xff08;首頁&#xff09;application.dart&#xff08;啟動加載類&#xff09;pubspec.yaml&#xff08;依賴配置文件&#xff09;login.dart&#xff08;登錄頁&…

記錄Jmeter 利用BeanShell 腳本解析JSON字符串

下載org.json包(文檔說明) #下載地址 https://www.json.org/ # github 地址 https://github.com/stleary/JSON-java # api 文檔說明 https://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects/com/esri/arcgis/server/json/JSONObject.htmlBeanShell腳本 import…

uniapp動態循環表單校驗失敗:初始值校驗

問題現象 &#x1f4a5; 在實現動態增減的單價輸入表單時&#xff08;基于uv-form組件&#xff09;&#xff0c;遇到以下詭異現象&#xff1a; <uv-input>的v-model綁定初始值為數字類型時&#xff0c;required規則失效 ?數字類型與字符串類型校驗表現不一致 &#x1…

UML 圖六種箭頭含義詳解:泛化、實現、依賴、關聯、聚合、組合

目錄 一、泛化&#xff08;Generalization&#xff09; 概念 表示方法 二、實現&#xff08;Realization&#xff09; 概念 表示方法 三、依賴&#xff08;Dependency&#xff09; 概念 表示方法 四、關聯&#xff08;Association&#xff09; 概念 表示方法 五、…

Android Logcat總結

文章目錄 Android Logcat總結日志格式過濾日志正向過濾反向過濾正則過濾日志等級 Android Logcat總結 日志格式 用法&#xff1a; Log.e("TAG", "hello") Log.i("TAG", "hello") Log.d("TAG", "hello")依次為&…

Unity UGUI - 六大基礎組件

目錄 一、Canvas上 1. Canvas&#xff1a;復制渲染子UI控件 2. ?Canvas Scaler?&#xff1a;畫布分辨率自適應 3. Graphics Raycaster&#xff1a;射線事件響應 4. ?Rect Transform?&#xff1a;UI位置錨點對齊 二、Event System上 5. Event System 6. Standalone …

基于Springboot的網上訂餐系統 【源碼】+【PPT】+【開題報告】+【論文】

網上訂餐系統是一個基于Java語言和Spring Boot框架開發的Web應用&#xff0c;旨在為用戶和管理員提供一個便捷的訂餐平臺。該系統通過簡化餐飲訂購和管理流程&#xff0c;為用戶提供快速、高效的在線訂餐體驗&#xff0c;同時也為管理員提供完善的后臺管理功能&#xff0c;幫助…

css 實現閃爍光標

要實現閃爍光標&#xff08;比如文本輸入框內常見的閃爍效果&#xff09;&#xff0c;可以使用 CSS 動畫。下面是一個簡單的方法&#xff1a; 代碼示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta n…

從JVM底層揭開Java方法重載與重寫的面紗:原理、區別與高頻面試題突破

&#x1f31f;引言&#xff1a;一場由方法調用引發的"血案" 2018年&#xff0c;某電商平臺在"雙十一"大促期間遭遇嚴重系統故障。 技術團隊排查發現&#xff0c;問題根源竟是一個繼承體系中的方法重寫未被正確處理&#xff0c;導致訂單金額計算出現指數級…

詳解Spark executor

在 Apache Spark 中&#xff0c;Executor&#xff08;執行器&#xff09; 是運行在集群工作節點&#xff08;Worker Node&#xff09;上的進程&#xff0c;負責執行具體的計算任務并管理數據。它是 Spark 分布式計算的核心組件之一&#xff0c;直接決定了任務的并行度和資源利用…

適配器模式及其典型應用

引言 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許不兼容的接口協同工作。適配器模式通過創建一個適配器類來轉換一個類的接口&#xff0c;使其能夠與另一個類的接口兼容。這種模式在實際開發中非常有用&#xff0c;特別是在需要…

如何在 Vue 項目中使用v - for指令進行列表渲染,如何優化其性能?

大白話如何在 Vue 項目中使用v - for指令進行列表渲染&#xff0c;如何優化其性能&#xff1f; 在Vue項目里&#xff0c;咱們常常會碰到要把一組數據渲染成列表的狀況。這時候&#xff0c;v-for指令就派上大用場啦&#xff01;它能讓咱們輕松地把數據數組里的每個元素渲染成對…

qt QQuaternion詳解

1. 概述 QQuaternion 是 Qt 中用于表示三維空間中旋轉的四元數類。它包含一個標量部分和一個三維向量部分&#xff0c;可以用來表示旋轉操作。四元數在計算機圖形學中廣泛用于平滑的旋轉和插值。 2. 重要方法 默認構造函數 QQuaternion::QQuaternion(); // 構造單位四元數 (1…

如何將爬取的評論數據存儲到數據庫?

在使用Python爬蟲獲取1688商品評論后&#xff0c;將這些數據存儲到數據庫中是一個常見的需求。這樣可以方便后續的數據分析、查詢和管理。本文將詳細介紹如何將爬取的評論數據存儲到數據庫中&#xff0c;包括MySQL和SQLite兩種常見的數據庫。 一、準備工作 1. 安裝必要的Pytho…

Maven中為什么有些依賴不用引入版本號

先給出一個例子&#xff1a; <parent><artifactId>sky-take-out</artifactId><groupId>com.sky</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>sky-s…