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

ngx_http_set_exten

1 定义

ngx_http_set_exten 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.c
voidngx_http_set_exten(ngx_http_request_t*r){ngx_int_ti;ngx_str_null(&r->exten);for(i=r->uri.len-1;i>1;i--){if(r->uri.data[i]=='.'&&r->uri.data[i-1]!='/'){r->exten.len=r->uri.len-i-1;r->exten.data=&r->uri.data[i+1];return;}elseif(r->uri.data[i]=='/'){return;}}return;}
ngx_http_set_exten 函数的作用是 从请求的 URI 中提取文件扩展名(如 `html`、`jpg`), 并存储到 `r->exten` 字段中,供后续模块(如 MIME 类型设置)使用。 如果 URI 没有扩展名,则 `r->exten` 被置空。

2 详解

1 函数签名·

voidngx_http_set_exten(ngx_http_request_t*r)
返回值 函数无返回值 该函数的唯一职责是修改请求结构体 r 内部的 exten 字段
参数 ngx_http_request_t *r 指向当前请求的结构体 作为函数输入来源: 函数从 r->uri 读取当前请求的 URI 字符串及其长度,作为提取扩展名的源数据。 作为函数输出目标: 函数直接修改 r->exten 的两个成员(len 和 data),将结果写回请求结构体。 如果找到了扩展名,r->exten.data 会指向 r->uri.data 中的某个位置, 不分配新内存,实现零拷贝。

2 逻辑流程

1 初始化 2 从后向前 循环查找 2-1 成功匹配 2-2 遇到 / 前未匹配 3 查找结束未匹配

1 初始化
{ngx_int_ti;ngx_str_null(&r->exten);
将请求的 exten 字段初始化为空字符串

2 从后向前 循环查找
for(i=r->uri.len-1;i>1;i--){if(r->uri.data[i]=='.'&&r->uri.data[i-1]!='/'){r->exten.len=r->uri.len-i-1;r->exten.data=&r->uri.data[i+1];return;}elseif(r->uri.data[i]=='/'){return;}}
从 URI 字符串的最后一个字符开始,向前遍历,索引递减。 循环条件 i > 1 保证 i 最小为 2,循环体中 i-1 最小为 1,绝对防数组越界 后缀必在 URI 尾部,所以倒序扫描 条件是 i > 1 ,因为 URI 的第一个字符是 '/', 而 '.' 之前 '/' 之后至少需要一个字符来作为文件名 保证 i - 1 不会越界
#2-1 判断当前字符是否为点号(.),并且其前一个字符不是斜杠(/) r->uri.data[i] == '.': 找到了一个点号,可能是扩展名的开始。 r->uri.data[i - 1] != '/': 排除点号紧跟在路径分隔符之后的情况,即隐藏文件或目录名(如 /home/.hidden)。 如果点号前是 /,则该点是文件名的第一个字符,不是扩展名分隔符。 意义: 准确识别扩展名分隔符
设置扩展名字符串的长度。 r->uri.len 是 URI 总长度, i 是点号的索引, 所以 r->uri.len - i - 1 是点号之后所有字符的数量。 将扩展名的数据指针指向点号之后的下一个字符,即扩展名的第一个字符。 成功提取扩展名后,立即从函数返回,无需继续扫描剩余字符
#2-2 如果当前字符不是符合条件的点号,则检查是否是斜杠 / 从后向前扫描,如果先遇到 /,说明这个路径段已经结束, 而在此之前没有遇到合法的点号,因此该 URI 没有扩展名 直接返回,扩展名保持为空

3 查找结束未匹配
return;}
如果循环正常结束而未提前返回, 则执行此语句,函数结束
http://www.jsqmd.com/news/968678/

相关文章:

  • 别再凭感觉定选题!用CSDN真实CTR/CSR/SSR三指标交叉分析,3天内重构你的技术博客选题矩阵
  • 别墅新中式整木定制工厂哪家好 - 舒雯文化
  • AI教材编写新选择!低查重AI工具,快速生成规范教材内容!
  • 文本扩展:可控语义增殖的Prompt工程方法论
  • 2026昆明黄金回收怎么不被坑?看正规报价与专业鉴定标准 - 薛定谔的梨花猫
  • 5分钟搞定Mac Boot Camp驱动部署:告别繁琐手动操作的一键式解决方案
  • 2026最新的 氯化橡胶面漆优质生产厂家实力排行盘点 优先推荐廊坊佐涂防腐设备有限公司 - 奔跑123
  • 前端课程结构图谱工具:拖入JSON就能生成带依赖路径的可点击课程地图
  • 抖音批量下载工具终极指南:5分钟搞定无水印视频批量下载
  • 2026年实测|五大GEO优化服务商核心能力全景对标:企业选型避坑全攻略 - GEO优化
  • 2026年广州小程序商城开发公司怎么选 - 凡科杰建云
  • CSDN AI数字营销发票开具终极问答(含普票自动开具路径、专票增额流程、电子专票法律效力说明)
  • Axure RP中文界面一键切换终极指南:揭秘专业原型设计工具的本土化配置
  • Altium Designer蛇形走线实战:高速PCB等长布线的原理、方法与避坑指南
  • 2026年AI建站和模板建站有什么区别 - 凡科杰建云
  • 2026年企业官网AI建站靠谱吗 - 凡科杰建云
  • 无锡滨湖区黄金上门回收,足不出户高价变现 - 上门黄金回收
  • 从面试题到生产实践:深度拆解华为FusionSphere OpenStack网络平面的‘为什么’
  • 2026年苏州品牌首饰回收防坑指南!揭秘行业常见套路 - 薛定谔的梨花猫
  • BK1085 FM收音芯片电路设计:从原理图到PCB布局的完整解析
  • Win11下Nacos 2.0.3启动卡在‘nacos is starting with cluster’?一个配置项就搞定
  • 东莞万江街道金价944元高位震荡,黄金回收如何变现? - 上门黄金回收
  • 从废弃设备到高效服务器:基于Armbian的电视盒子技术重构指南
  • GEO优化服务商怎么选?谁最专业靠谱?2026年6月国内最新TOP5排行GEO领跑者盘点与对比 - GEO优化
  • 2026年geo优化领跑者:技术能力与实战成效全评 - GEO优化
  • 天梭官方售后维修保养中心:全国直营网点地址及联系电话(2026年6月发布) - 天梭服务中心
  • 如何彻底清理macOS应用残留?Pearcleaner 5步专业级系统优化指南
  • geo优化服务商五强权威榜单2026年6月最新版:技术与案例双维深度解读+geo常见问题解答 - GEO优化
  • 2026最新的 氰凝防水防腐涂料优质生产厂家实力排行盘点 优先推荐廊坊佐涂防腐设备有限公司 - 奔跑123
  • 福州马尾区金价高位运行,闲置黄金变现正当时 - 上门黄金回收