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

ngx_http_map_uri_to_path

1 定义

ngx_http_map_uri_to_path 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.c
u_char*ngx_http_map_uri_to_path(ngx_http_request_t*r,ngx_str_t*path,size_t*root_length,size_treserved){u_char*last;size_talias;ngx_http_core_loc_conf_t*clcf;clcf=ngx_http_get_module_loc_conf(r,ngx_http_core_module);alias=clcf->alias;if(alias&&!r->valid_location){ngx_log_error(NGX_LOG_ALERT,r->connection->log,0,"\"alias\" cannot be used in location \"%V\" ""where URI was rewritten",&clcf->name);returnNULL;}if(clcf->root_lengths==NULL){*root_length=clcf->root.len;path->len=clcf->root.len+reserved+r->uri.len-alias+1;path->data=ngx_pnalloc(r->pool,path->len);if(path->data==NULL){returnNULL;}last=ngx_copy(path->data,clcf->root.data,clcf->root.len);}else{if(alias==NGX_MAX_SIZE_T_VALUE){reserved+=r->add_uri_to_alias?r->uri.len+1:1;}else{reserved+=r->uri.len-alias+1;}if(ngx_http_script_run(r,path,clcf->root_lengths->elts,reserved,clcf->root_values->elts)==NULL){returnNULL;}if(ngx_get_full_name(r->pool,(ngx_str_t*)&ngx_cycle->prefix,path)!=NGX_OK){returnNULL;}*root_length=path->len-reserved;last=path->data+*root_length;if(alias==NGX_MAX_SIZE_T_VALUE){if(!r->add_uri_to_alias){*last='\0';returnlast;}alias=0;}}last=ngx_copy(last,r->uri.data+alias,r->uri.len-alias);*last='\0';returnlast;}
ngx_http_map_uri_to_path 函数的作用是 将请求 URI 根据 `root` 或 `alias` 配置映射为文件系统上的绝对路径, 并在路径末尾预留指定字节的空间, 返回指向路径末尾的指针, 方便后续拼接索引文件名等操作。

2 详解

1 函数签名

u_char*ngx_http_map_uri_to_path(ngx_http_request_t*r,ngx_str_t*path,size_t*root_length,size_treserved)
返回值 成功时: 返回一个指针,指向映射生成的文件系统路径字符串的末尾 (即路径最后一个字符之后的位置,通常是路径中最后一个 / 的后面)。 调用者可以在此处直接拼接后续的文件名(如索引文件),无需重新计算偏移。 失败时: 返回 NULL,表示路径映射过程中出现错误(如内存分配失败等)。 设计意义: 返回值同时承担了“成功/失败”判断和“写入位置”指示的双重职责。
参数1 ngx_http_request_t *r 指向当前请求的上下文结构体
参数2 ngx_str_t *path 作为输出参数 path->data:指向新分配(或复用)的内存缓冲区,存放生成的完整文件系统路径
参数3 size_t *root_length 作为输出参数 存放从路径起始到“根路径结束位置”的长度。 具体来说,就是 root 指令指定的路径部分所占的字节数
参数4 size_t reserved 作为输入参数。 调用者要求在生成的路径缓冲区末尾至少保留多少字节的空闲空间

2 逻辑流程

1 局部变量 2 配置获取 3 安全检查 4 根路径生成 5 URI 拼接与路径完成

1 局部变量
{u_char*last;size_talias;ngx_http_core_loc_conf_t*clcf;

2 配置获取
clcf=ngx_http_get_module_loc_conf(r,ngx_http_core_module);alias=clcf->alias;
获取当前请求所匹配 location 的 HTTP 核心模块配置, 将配置中的 alias 值赋给局部变量 alias

3 安全检查
if(alias&&!r->valid_location){ngx_log_error(NGX_LOG_ALERT,r->connection->log,0,"\"alias\" cannot be used in location \"%V\" ""where URI was rewritten",&clcf->name);returnNULL;}
alias:局部变量,其值来自 clcf->alias。当 location 配置了 alias 指令时,该值为非零 r->valid_location:请求中的一个标志位。 初始为 1,表示当前 location 配置有效。 如果在 rewrite 阶段修改了 URI,该标志会被置为 0 当同时满足“使用了 alias”且“location 有效性已被破坏(URI 被改写)”时进入分支 alias 的工作原理是将 location 前缀直接替换为指定的文件系统路径, 这种映射强依赖于请求 URI 与 location 的匹配关系。 一旦 URI 被 rewrite 修改,原始 location 的匹配结果就可能不再准确, 若继续使用 alias 进行路径拼接,很可能构造出错误的文件路径
记录日志 返回 NULL 表示路径映射失败

4 根路径生成
if(clcf->root_lengths==NULL){*root_length=clcf->root.len;path->len=clcf->root.len+reserved+r->uri.len-alias+1;path->data=ngx_pnalloc(r->pool,path->len);if(path->data==NULL){returnNULL;}last=ngx_copy(path->data,clcf->root.data,clcf->root.len);
静态 `root`(未包含变量) 如果 `root_lengths` 为 `NULL`, 说明 `root` 指令的值是静态字符串, 没有包含任何变量。可以直接拼接,无需运行脚本。
将根路径长度记录到 `*root_length`,供调用者后续计算 URI 对应的路径偏移。
计算映射后整个路径字符串所需的总长度: - `clcf->root.len`:根路径本身的长度。 - `reserved`:调用者要求的额外预留空间。 - `r->uri.len - alias`:需要附加的 URI 部分的长度。 若为 root 模式(`alias == 0`),就是完整 URI 长度; 若为 alias 模式,`alias` 为 alias 路径的长度,-alias 剔除已被替换的 URI 前缀 - `+1`:为结尾的 `'\0'` 预留空间。 意义:一次性计算出所需缓冲区大小,确保后续拼接不会溢出。
从请求内存池分配 `path->len` 字节的内存,失败返回 `NULL`。
将 `root` 字符串复制到缓冲区开头, `ngx_copy` 返回复制后的尾部指针,赋给 `last`。 此时 `last` 指向根路径字符串的末尾, 准备拼接 URI 部分(如果需要)

}else{if(alias==NGX_MAX_SIZE_T_VALUE){reserved+=r->add_uri_to_alias?r->uri.len+1:1;}else{reserved+=r->uri.len-alias+1;}if(ngx_http_script_run(r,path,clcf->root_lengths->elts,reserved,clcf->root_values->elts)==NULL){returnNULL;}if(ngx_get_full_name(r->pool,(ngx_str_t*)&ngx_cycle->prefix,path)!=NGX_OK){returnNULL;}*root_length=path->len-reserved;last=path->data+*root_length;if(alias==NGX_MAX_SIZE_T_VALUE){if(!r->add_uri_to_alias){*last='\0';returnlast;}alias=0;}}
动态 `root`(含变量)

5 URI 拼接与路径完成
last=ngx_copy(last,r->uri.data+alias,r->uri.len-alias);*last='\0';
拼接 URI 部分 在拼接后的路径末尾添加空字符, 形成一个合法的 C 字符串

returnlast;}
返回 `last`,指向路径字符串的末尾(`'\0'` 的位置), 调用者可以在此处继续写入(例如索引文件名),
http://www.jsqmd.com/news/970481/

相关文章:

  • 终极免费在线法线贴图生成器:3步打造专业级3D材质效果
  • 地热采灌井 + 抽水试验一体化水位监测成套仪器选型方案 - 王工聊地下水监测
  • Modbus RTU协议调试避坑指南:从报文抓取到错误解析(附Modbus Poll/Simulator实战)
  • 2026 年 6 月最新!沈阳旧书老书回收联系方式+电话:皇姑/和平区老板价高实在 - 资讯纵览
  • 我用这 5 款 VS Code 插件,开发效率直接提升 3 倍
  • NS-Emu-Tools 技术指南:掌握 Yuzu 与 Citron 模拟器管理方案
  • 2026年6月长沙GEO服务商实测排行|行业乱象避坑清单(干货向) - 第三方测评
  • 摸头石头编程
  • .git文件夹里所有文件详解
  • 案例:买飞机票;验证码
  • 终极文件编码检测工具:EncodingChecker批量编码验证完全指南
  • Honey Select 2汉化补丁终极指南:3步实现完整中文体验
  • 客户管理系统(CRM)怎么选?2026年主流系统平台对比与场景解析
  • 郑州黄金奢侈品回收店甄选指南(2026 权威版)资质设备报价服务口碑五大维度严选 - 新闻快传
  • 南昌墨客雅筑(宸智雅筑)装饰官方联系方式 合作电话 官网入口 避坑指南 - 资讯纵览
  • 番茄小说下载器终极指南:如何快速下载小说并生成有声书
  • 为什么每个设计者都需要一个像LitCAD这样的开源CAD软件?[特殊字符]
  • 2026 年 6 月沈阳旧书老书回收价格实测3家靠谱商家:联系方式+电话全城免费上门 - 资讯纵览
  • 襄阳地区电捕焦油器厂家实力排行:技术与资质对比 - 奔跑123
  • 上海市金山区上贤雅筑(宸智雅筑)装饰官方联系方式 合作电话 官网入口 避坑指南 - 资讯纵览
  • 大件重物寄快递怎么省钱?这样寄最便宜 - 快递物流资讯
  • 为什么NanaZip是现代Windows用户必备的7-Zip升级版?
  • 如何快速使用AZ音乐下载器:完整功能指南与技巧
  • KMS智能激活工具:从零基础到高级配置的完整指南
  • 零依赖图像对比利器:用Image Compare Viewer重构视觉差异检测体验
  • 2026年6月沈阳老书旧书回收藏家私藏榜单:3 家靠谱回收,老板人好价高不坑人附:联系方式+电话 - 资讯纵览
  • 如何在浏览器中免费解锁加密音乐文件:Unlock-Music完整使用指南
  • 为什么你的微服务越拆越乱?谈谈领域驱动设计的落地教训
  • 地热井抽水试验水位监测设备|高温深井投入式水位计选型方案 - 王工聊地下水监测
  • Cowabunga Lite:无需越狱的iOS深度定制工具完全指南