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

ngx_http_find_virtual_server

1 定义ngx_http_find_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstaticngx_int_tngx_http_find_virtual_server(ngx_connection_t*c,ngx_http_virtual_names_t*virtual_names,ngx_str_t*host,ngx_http_request_t*r,ngx_http_core_srv_conf_t**cscfp){ngx_http_core_srv_conf_t*cscf;if(virtual_namesNULL){returnNGX_DECLINED;}cscfngx_hash_find_combined(virtual_names-names,ngx_hash_key(host-data,host-len),host-data,host-len);if(cscf){*cscfpcscf;returnNGX_OK;}#if(NGX_PCRE)if(host-lenvirtual_names-nregex){ngx_int_tn;ngx_uint_ti;ngx_http_server_name_t*sn;snvirtual_names-regex;#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(rNULL){ngx_http_connection_t*hc;for(i0;ivirtual_names-nregex;i){nngx_regex_exec(sn[i].regex-regex,host,NULL,0);if(nNGX_REGEX_NO_MATCHED){continue;}if(n0){hcc-data;hc-ssl_servername_regexsn[i].regex;*cscfpsn[i].server;returnNGX_OK;}ngx_log_error(NGX_LOG_ALERT,c-log,0,ngx_regex_exec_n failed: %i on \%V\ using \%V\,n,host,sn[i].regex-name);returnNGX_ERROR;}returnNGX_DECLINED;}#endif/* NGX_HTTP_SSL defined SSL_CTRL_SET_TLSEXT_HOSTNAME */for(i0;ivirtual_names-nregex;i){nngx_http_regex_exec(r,sn[i].regex,host);if(nNGX_DECLINED){continue;}if(nNGX_OK){*cscfpsn[i].server;returnNGX_OK;}returnNGX_ERROR;}}#endif/* NGX_PCRE */returnNGX_DECLINED;}ngx_http_find_virtual_server 函数用于 根据 HTTP 请求的主机名Host 头 在监听端口的虚拟主机名集合中查找对应的 server 配置。 它优先进行精确及通配符哈希查找 若失败则按顺序尝试正则匹配支持 SSL SNI 阶段的特殊处理 最终返回匹配到的虚拟服务器配置或未找到标志。2 详解1 函数签名staticngx_int_tngx_http_find_virtual_server(ngx_connection_t*c,ngx_http_virtual_names_t*virtual_names,ngx_str_t*host,ngx_http_request_t*r,ngx_http_core_srv_conf_t**cscfp)返回值 NGX_OK成功找到匹配的虚拟服务器*cscfp 已指向对应配置。 NGX_DECLINED未找到任何匹配调用者应使用默认服务器。 NGX_ERROR匹配过程中发生严重错误应中断当前连接。参数1 ngx_connection_t *c 当前连接参数2 ngx_http_virtual_names_t *virtual_names 指向 该地址端口下的虚拟主机名集合参数3 ngx_str_t *host 表示待匹配的主机名参数4 ngx_http_request_t *r 指向 当前 HTTP 请求结构体的指针可以为 NULL参数5 ngx_http_core_srv_conf_t **cscfp 指向服务器配置指针的指针二级指针 输出参数当查找成功时 将 *cscfp 设置为匹配到的 server 块配置。 查找失败时不修改。2 逻辑流程1 局部变量 2 空集合检查 3 hash 查找 4 查找成功 5 正则相关处理 6 未匹配1 局部变量{ngx_http_core_srv_conf_t*cscf;cscf类型为指向服务器核心配置的指针 用于暂存哈希查找的结果初始值未定义2 空集合检查if(virtual_namesNULL){returnNGX_DECLINED;}空指针检查 若传入的虚拟主机名集合为 NULL 通常意味着当前监听端口未配置任何 server_name 则立即返回 NGX_DECLINED表示未找到匹配 调用者会使用默认服务器。 这避免了对空指针的非法访问。3 hash 查找cscfngx_hash_find_combined(virtual_names-names,ngx_hash_key(host-data,host-len),host-data,host-len);精确/通配哈希查找 调用 ngx_hash_find_combined 在组合哈希表 virtual_names-names 中查找。 该哈希表同时存储了精确名称、前缀通配符*.example.com和后缀通配符www.*。 ngx_hash_key(host-data, host-len) 计算主机名字符串的哈希值BKDR 哈希算法用于定位桶。 后两个参数传递原始字符串和长度用于在桶内逐字比对防止哈希碰撞。 返回匹配到的 ngx_http_core_srv_conf_t 指针若未找到则为 NULL。4 查找成功if(cscf){*cscfpcscf;returnNGX_OK;}检查哈希查找结果 若 cscf 非空说明成功匹配。 *cscfp cscf 将输出参数指向该服务器配置。 返回 NGX_OK调用者即可使用 *cscfp 获得服务器配置。5 正则相关处理#if(NGX_PCRE)if(host-lenvirtual_names-nregex){ngx_int_tn;ngx_uint_ti;ngx_http_server_name_t*sn;snvirtual_names-regex;#if(NGX_HTTP_SSLdefined SSL_CTRL_SET_TLSEXT_HOSTNAME)if(rNULL){ngx_http_connection_t*hc;for(i0;ivirtual_names-nregex;i){nngx_regex_exec(sn[i].regex-regex,host,NULL,0);if(nNGX_REGEX_NO_MATCHED){continue;}if(n0){hcc-data;hc-ssl_servername_regexsn[i].regex;*cscfpsn[i].server;returnNGX_OK;}ngx_log_error(NGX_LOG_ALERT,c-log,0,ngx_regex_exec_n failed: %i on \%V\ using \%V\,n,host,sn[i].regex-name);returnNGX_ERROR;}returnNGX_DECLINED;}#endif/* NGX_HTTP_SSL defined SSL_CTRL_SET_TLSEXT_HOSTNAME */for(i0;ivirtual_names-nregex;i){nngx_http_regex_exec(r,sn[i].regex,host);if(nNGX_DECLINED){continue;}if(nNGX_OK){*cscfpsn[i].server;returnNGX_OK;}returnNGX_ERROR;}}#endif/* NGX_PCRE */6 未匹配returnNGX_DECLINED;}最终未匹配 如果哈希表和所有正则如果有都未找到 返回 NGX_DECLINED。 调用者将使用监听端口的默认服务器。
http://www.zskr.cn/news/1360104.html

相关文章:

  • 清除缓存,释放C盘
  • Taotoken 的 API Key 权限管理与审计日志功能在安全开发中的价值
  • 游戏NPC不再脚本化!Unity+LangChain Agent实时剧情生成技术,上线72小时用户时长↑43%
  • 自定义中间件限流limit
  • 酒店客控系统十大品牌2026排行-技术路线与选型建议
  • 分享一个Python爬虫的小技巧
  • 面部美化 API 集成指南
  • 蒲公英R300重磅升级!串口数据采集与MQTT上云一步到位!
  • RadexMarkets瑞德克斯:到账时效与影响因素的客观说明
  • 接口性能优化实战:从 5 秒到 50ms,我做了这 6 件事
  • AI智能体应用工程师报名流程拆解:学习、考试、证书查询一次说清 - 精选教育培训热点
  • 终极游戏库管理器Playnite:一站式管理20+平台游戏的最佳解决方案
  • 当Windows 11变得臃肿时:如何用开源工具Win11Debloat重获系统控制权
  • 高效解决PostgreSQL镜像拉取难题:DaoCloud镜像同步实战深度解析
  • python智慧乡村治理平台系统
  • PlugOS: 重构移动安全——让安全系统与智能手机硬件解耦
  • 《男人来自火星,女人来自金星4:生活篇》第10-12章深度解读:性别化饮食、体型密码与自我治愈终极指南
  • P4777 【模板】扩展中国剩余定理(EXCRT)题解
  • 2026年5月诚信的阻燃电缆沟盖板厂家,免费样品测试助力客户精准选型适配项目 - 品牌鉴赏师
  • 淘宝闪购官宣招募服务商:5大模式开启餐饮数字化新红利
  • 【广东专升本】2026广东专升本真题PDF+备考资料汇总|政治英语+专业基础课+专业综合课+模拟卷
  • 内网离线部署RPA:打包EXE+本地激活+数据零上云方案
  • Codex CLI 接 Gemini 3.5 Flash 实测:代码生成、推理速度、价格三维度横评(2026)
  • 苗带识别导向的水田管理机直线辅助驾驶系统【附程序】
  • 解决连接蓝牙音箱默认音量100%的问题
  • 深夜办公不掉链:2026免费PDF转PPT工具Top榜 - 时讯资讯
  • 题解:luogu P8996([CEOI 2022] Abracadabra)
  • agent memory论文解析一:解析项目(a-mem)
  • 机场应急处置保障:黎阳之光无感赋能,精准调度救援,提升处置能力
  • Python自动化办公:批量处理Word文档的实用技巧