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

ngx_http_join_exact_locations

1 定义

ngx_http_join_exact_locations 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.c
staticngx_int_tngx_http_join_exact_locations(ngx_conf_t*cf,ngx_queue_t*locations){ngx_queue_t*q,*x;ngx_http_location_queue_t*lq,*lx;q=ngx_queue_head(locations);while(q!=ngx_queue_last(locations)){x=ngx_queue_next(q);lq=(ngx_http_location_queue_t*)q;lx=(ngx_http_location_queue_t*)x;if(lq->name->len==lx->name->len&&ngx_filename_cmp(lq->name->data,lx->name->data,lx->name->len)==0){if((lq->exact&&lx->exact)||(lq->inclusive&&lx->inclusive)){ngx_log_error(NGX_LOG_EMERG,cf->log,0,"duplicate location \"%V\" in %s:%ui",lx->name,lx->file_name,lx->line);returnNGX_ERROR;}lq->inclusive=lx->inclusive;ngx_queue_remove(x);continue;}q=ngx_queue_next(q);}returnNGX_OK;}
ngx_http_join_exact_locations 函数的作用是 将 URI 相同的精确匹配(location = /uri)和前缀匹配(location /uri)合并到同一个链表节点中。

2 详解

1 函数签名

staticngx_int_tngx_http_join_exact_locations(ngx_conf_t*cf,ngx_queue_t*locations)
返回值 返回 NGX_OK(通常为 0)表示成功。 返回 NGX_ERROR(通常为 -1)表示失败。
参数 ngx_conf_t *cf 指向配置解析上下文 ngx_queue_t *locations location 配置链表的头节点(哨兵节点)

2 逻辑流程

1 局部变量 2 遍历查找 URI 相同的相邻节点 3 返回成功

1 局部变量
{ngx_queue_t*q,*x;ngx_http_location_queue_t*lq,*lx;

2 遍历查找 URI 相同的相邻节点
q=ngx_queue_head(locations);while(q!=ngx_queue_last(locations)){x=ngx_queue_next(q);lq=(ngx_http_location_queue_t*)q;lx=(ngx_http_location_queue_t*)x;if(lq->name->len==lx->name->len&&ngx_filename_cmp(lq->name->data,lx->name->data,lx->name->len)==0){if((lq->exact&&lx->exact)||(lq->inclusive&&lx->inclusive)){ngx_log_error(NGX_LOG_EMERG,cf->log,0,"duplicate location \"%V\" in %s:%ui",lx->name,lx->file_name,lx->line);returnNGX_ERROR;}lq->inclusive=lx->inclusive;ngx_queue_remove(x);continue;}q=ngx_queue_next(q);}
#1 获取队列 locations 的头节点指针,赋值给 q
#2 循环条件,判断当前节点 q 是否是队列的最后一个节点
#3 获取当前节点 q 的下一个节点指针,赋值给 x
#4 将通用的 ngx_queue_t 节点指针强制转换为具体的 ngx_http_location_queue_t 类型指针
#5 判断相邻两个 location 的路径是否完全相同。
#6 检查两个 location 的匹配类型是否冲突 完全重复的类型定义,这是配置错误 输出错误日志 返回错误码
#7 将后一个节点 lx 的 inclusive 标志赋值给前一个节点 lq
#8 从队列中删除节点 x
#9 当相邻两个节点路径不同时, 将 q 移动到下一个节点

3 返回成功
returnNGX_OK;}
http://www.jsqmd.com/news/563219/

相关文章:

  • GESP三级语法知识(六、string 入门与基础操作)
  • 基于STM32的直流电机PWM调速系统设计与实现(含代码分享)
  • 深入剖析Keil-MDK编译结果:Code、RO-data、RW-data与ZI-data的存储与运行机制
  • 从‘虚拟’到‘物理’:程序员视角下的内存块、页框与页到底是怎么协作的?
  • Downr1n实战手册:解锁iOS设备降级自由,告别版本限制的终极方案
  • G-Helper完全手册:华硕笔记本终极性能调优指南
  • 【5G NTN语音增强】面向应急通信的IoT NTN低时延语音方案设计与信令优化
  • 3大突破!RevokeMsgPatcher让消息防撤回效率提升80%全方位解决方案
  • SenseVoice模型实战 | 微调训练如何攻克AI领域专业术语的语音识别难题
  • BepInEx插件框架:构建企业级Unity游戏扩展的5大核心架构设计
  • 视频硬字幕提取终极指南:本地化AI工具让字幕制作效率提升10倍
  • 避坑指南:Silvaco TCAD光电仿真中,均匀光与高斯光设置对结果影响的深度解析
  • 告别配置焦虑:用LVGL v9的lv_conf.h模板快速适配你的开发板(STM32/ESP32/Raspberry Pi Pico)
  • 90%的中小公司Docker排查耗时过长:3步通用法让工作效率提升5倍
  • 3 solidJS实战:响应式状态管理的革命性设计与高效开发流程在现代前端开发中,
  • Chiplet通信结构实战指南:从AMD EPYC到Intel AIB的架构选择与性能对比
  • 金三银四大模型面试通关秘籍!面试官最爱的高频考点+答案解析,助你轻松拿下Offer!
  • Java内存溢出别慌!手把手教你用jvisualvm分析.hprof文件(附实战代码)
  • 二叉树面试送分题|力扣101对称+226翻转(递归极简写法,手写无压力)
  • 告别臃肿SDK!手把手教你用PyQt5+奥比中光SDK精简版,5分钟搞定深度相机实时显示
  • 别再瞎设50Ω了!HFSS/CST仿真中S参数端口阻抗到底怎么设?手把手教你避坑
  • 深度学习实战:从零构建验证码识别模型
  • 避坑指南:解决Ubuntu 22.04 + ROS Humble下MAVROS编译失败的几个常见问题
  • CH1115 OLED驱动库:内存优化多屏共享与硬件动画实现
  • ComfyUI更新后报错不断?手把手教你排查GPU显存与节点缺失问题(附4090实测)
  • UPS后备时间怎么算?一文读懂核心公式逻辑
  • 《string 专项 训练(进阶)习题》
  • 5分钟掌握CT肺部分割:lungmask深度学习实战完整指南
  • 用Multisim和74LS系列芯片复刻经典交通灯:一个电子课程设计的完整复盘与避坑指南
  • 如何彻底解决iPhone过热降频问题?thermalmonitordDisabler完整指南