当前位置: 首页 > 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.zskr.cn/news/1480422.html

相关文章:

  • Axure RP中文界面一键切换终极指南:揭秘专业原型设计工具的本土化配置
  • Altium Designer蛇形走线实战:高速PCB等长布线的原理、方法与避坑指南
  • 2026年苏州品牌首饰回收防坑指南!揭秘行业常见套路 - 薛定谔的梨花猫
  • 无锡滨湖区黄金上门回收,足不出户高价变现 - 上门黄金回收
  • 2026年geo优化领跑者:技术能力与实战成效全评 - GEO优化
  • 天梭官方售后维修保养中心:全国直营网点地址及联系电话(2026年6月发布) - 天梭服务中心
  • 2026最新的 轻集料混凝土优质生产厂家实力排行盘点 推荐廊坊锦茂节能科技有限公司 - 奔跑123
  • geo优化服务商五强权威榜单2026年6月最新版:技术与案例双维深度解读+geo常见问题解答 - GEO优化
  • 2026最新的 氰凝防水防腐涂料优质生产厂家实力排行盘点 优先推荐廊坊佐涂防腐设备有限公司 - 奔跑123
  • League Akari:基于LCU API的深度技术解析与实战应用指南
  • AI教材写作指南:低查重AI工具,打造高质量专业教材!
  • 兰州西固区黄金回收行情解析与避坑指南 - 上门黄金回收
  • 2026 泉州漏水维修攻略|苏易修缮:厨卫 / 阳台 / 外墙 / 屋顶 / 地下室|靠谱防水门店 - 苏易修缮
  • 2026 景德镇漏水维修攻略|苏易修缮:厨卫 / 阳台 / 外墙 / 屋顶 / 地下室|靠谱防水门店 - 苏易修缮
  • ST7920图形显示原理与实战:从GDRAM寻址到Keil汉字BUG修复
  • 2026 鹰潭漏水维修攻略|苏易修缮:厨卫 / 阳台 / 外墙 / 屋顶 / 地下室|靠谱防水门店 - 苏易修缮
  • OBS背景移除插件终极指南:5分钟实现专业级绿幕效果,无需昂贵设备
  • Vue-cron组件踩坑记:从安装到对接Spring Boot后台的完整避坑指南
  • STM32 HardFault调试:从内存配置错误到工程配置的完整排查指南
  • 抖音下载神器:一键批量下载无水印视频的完整指南
  • 桂林七星区黄金回收避坑指南:今日金价944元,这些陷阱要小心 - 上门黄金回收
  • 长春二道区金价944元/克,本地回收价参考与避坑指南 - 上门黄金回收
  • 工业机器视觉照明技术全解析:从光源选型到实战打光技巧
  • 如何快速配置OBS虚拟摄像头:面向初学者的完整指南
  • 终极指南:Flameshot - 免费开源的强大截图工具
  • 完全掌控你的数字记忆:免费开源工具WeChatMsg终极使用指南
  • 2026最新的 玻化微珠保温砂浆优质生产厂家实力排行盘点 推荐廊坊锦茂节能科技有限公司 - 奔跑123
  • 2026年苏州高端品牌首饰回收估价技巧,本地人专属避坑攻略 - 薛定谔的梨花猫
  • 2026年6月大型宴席中心推荐,公司年会/回门宴/定制婚礼/户外花园婚礼/沉浸式婚礼/订婚宴/婚礼,大型宴席场地找哪家 - 品牌推荐师
  • 为什么你的CSDN封禁申诉总失败?揭秘AI数字营销权益处置背后的5级信用衰减模型与2类不可逆红线