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

ngx_http_core_access_phase

1 定义

ngx_http_core_access_phase 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.c
ngx_int_tngx_http_core_access_phase(ngx_http_request_t*r,ngx_http_phase_handler_t*ph){ngx_int_trc;ngx_table_elt_t*h;ngx_http_core_loc_conf_t*clcf;if(r!=r->main){r->phase_handler=ph->next;returnNGX_AGAIN;}ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r->connection->log,0,"access phase: %ui",r->phase_handler);rc=ph->handler(r);if(rc==NGX_DECLINED){r->phase_handler++;returnNGX_AGAIN;}if(rc==NGX_AGAIN||rc==NGX_DONE){returnNGX_OK;}clcf=ngx_http_get_module_loc_conf(r,ngx_http_core_module);if(clcf->satisfy==NGX_HTTP_SATISFY_ALL){if(rc==NGX_OK){r->phase_handler++;returnNGX_AGAIN;}}else{if(rc==NGX_OK){r->access_code=0;for(h=r->headers_out.www_authenticate;h;h=h->next){h->hash=0;}r->phase_handler=ph->next;returnNGX_AGAIN;}if(rc==NGX_HTTP_FORBIDDEN||rc==NGX_HTTP_UNAUTHORIZED){if(r->access_code!=NGX_HTTP_UNAUTHORIZED){r->access_code=rc;}r->phase_handler++;returnNGX_AGAIN;}}/* rc == NGX_ERROR || rc == NGX_HTTP_... */if(rc==NGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}ngx_http_finalize_request(r,rc);returnNGX_OK;}
ngx_http_core_access_phase 函数是 `NGX_HTTP_ACCESS_PHASE` 阶段的调度器, 其核心作用是:执行访问控制模块的 handler

2 详解

1 函数签名

ngx_int_tngx_http_core_access_phase(ngx_http_request_t*r,ngx_http_phase_handler_t*ph)
返回值 用于返回函数执行结果的状态码 NGX_AGAIN:告诉引擎“继续循环,处理下一个处理器” NGX_OK:告诉引擎“停止循环,挂起或终结请求”。
参数1 ngx_http_request_t *r 指向当前 HTTP 请求上下文结构体
参数2 ngx_http_phase_handler_t *ph 指向 ngx_http_phase_handler_t 结构体的指针, 代表当前在 阶段处理引擎 数组 中的处理器项

2 逻辑流程

1 局部变量 2 子请求直接跳过访问控制阶段 3 调用实际的访问控制模块 4 处理返回结果 4-1 NGX_DECLINED 4-2 NGX_AGAIN || NGX_DONE 4-3 satisfy all / satisfy any 策略 处理 4-4 错误处理

1 局部变量
{ngx_int_trc;ngx_table_elt_t*h;ngx_http_core_loc_conf_t*clcf;

2 子请求直接跳过访问控制阶段
if(r!=r->main){r->phase_handler=ph->next;returnNGX_AGAIN;}

ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r->connection->log,0,"access phase: %ui",r->phase_handler);

3 调用实际的访问控制模块
rc=ph->handler(r);

4 处理返回结果
4-1 NGX_DECLINED
if(rc==NGX_DECLINED){r->phase_handler++;returnNGX_AGAIN;}
模块不处理此请求 如果 handler 返回 NGX_DECLINED, 表示该模块对此请求不生效(如 IP 不在列表中), 将阶段索引加 1,继续调用同阶段的下一个访问控制模块。

4-2 NGX_AGAIN || NGX_DONE
if(rc==NGX_AGAIN||rc==NGX_DONE){returnNGX_OK;}
需要异步等待或请求已终结 NGX_AGAIN: 模块需要挂起等待 NGX_DONE: 模块已主动调用 ngx_http_finalize_request 结束了请求。 动作: 直接返回 NGX_OK 给引擎, 通知其退出当前阶段循环,暂停或结束请求。

4-3 satisfy all / satisfy any 策略 处理
clcf=ngx_http_get_module_loc_conf(r,ngx_http_core_module);
获取 satisfy 配置

if(clcf->satisfy==NGX_HTTP_SATISFY_ALL){if(rc==NGX_OK){r->phase_handler++;returnNGX_AGAIN;}}else{if(rc==NGX_OK){r->access_code=0;for(h=r->headers_out.www_authenticate;h;h=h->next){h->hash=0;}r->phase_handler=ph->next;returnNGX_AGAIN;}if(rc==NGX_HTTP_FORBIDDEN||rc==NGX_HTTP_UNAUTHORIZED){if(r->access_code!=NGX_HTTP_UNAUTHORIZED){r->access_code=rc;}r->phase_handler++;returnNGX_AGAIN;}}
satisfy all 模式处理
satisfy any 模式处理

4-4 错误处理
/* rc == NGX_ERROR || rc == NGX_HTTP_... */if(rc==NGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}
对 401 进行延迟处理(防暴力破解) 如果需要返回 401,调用 ngx_http_core_auth_delay 执行认证延迟逻辑。 该函数通常会设置一个定时器来推迟发送 401 响应,增大暴力破解的时间成本。

ngx_http_finalize_request(r,rc);returnNGX_OK;}
http://www.jsqmd.com/news/948576/

相关文章:

  • 别再死记硬背公式了!用LTspice仿真带你直观理解MOSFET的体效应和沟道调制
  • 别再只调参数了!深入STM32数控电源的PID恒流恒压算法与Protues仿真验证
  • 手把手教你用ESP-IDF V5.x为DHT11写一个健壮的驱动(附完整源码解析)
  • 如何快速掌握网页媒体提取:猫抓插件的完整资源嗅探指南
  • Arduino与舵机实现手机游戏自动化:从硬件连接到时序调优
  • Anybus嵌入式通信:让Furness小体积检漏仪也能拥有EtherNet/IP和PROFINET双接口
  • 009、STM32单片机分享:智能窗帘系统
  • 树莓派GPIO控制实战:打造实体MP3播放器
  • 基于树莓派与OpenCV的红外视觉魔杖交互系统:从手势识别到物理控制
  • 基于NE555与CD4026的纯硬件随机数生成器设计与实现
  • 基于PIC16F877A的多功能万用表DIY:从硬件设计到软件实现
  • 从内部框图看懂TB6612FNG:这个小芯片如何控制你的直流电机正反转?
  • LLM的上下文长度(Context Length):从4K到1M,真的越长越好吗?
  • 别再只盯着PCL了!这5个轻量级点云库(Cilantro/Easy3D/Open3D)更适合你的快速原型开发
  • Python实战:量化评估大语言模型的偏见、毒性与真实性
  • Qwen3.6 Plus深度评测:面向工程师的代码生成与中文理解实战指南
  • 【2024智能咨询黄金标准】:Gartner未公开的6项AI工具协同评估指标首次披露
  • 告别狭窄通道恐惧症:在ROS中手把手实现Voronoi势场Costmap插件(附源码)
  • 镭神C32雷达+KVH 1750 IMU标定实战:从驱动读取到lidar_align避坑全记录
  • 除了ChatGPT,试试这个本地免费的文本标点恢复工具:Sherpa-ONNX配置与评测
  • 黄仁勋封迈威尔为下一家万亿企业,它凭啥?AI互联和定制芯片市场潜力巨大!
  • 谷歌Gemini个人智能:跨应用推理与数据整合的技术真相
  • 基于斐波那契数列的RGB时钟:数学美学与嵌入式硬件的融合实践
  • 基于ATmega8的POV显示指尖陀螺:从硬件设计到低功耗编程
  • DIY辅助开关制作指南:用3.5mm接口与微动开关赋能特殊需求儿童
  • H.266/VVC帧内预测黑科技揭秘:从65个预测方向到AI矩阵预测(MIP)
  • Verilog里signed和unsigned的坑,我踩了三年才总结出这份避坑指南
  • Python数据处理提速实战:用multiprocessing.Pool并行处理200万行数据,我踩了这些坑
  • DIY蓝牙音频放大器:基于PAM8403与蓝牙模块的极简方案
  • 合江县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化