1 定义ngx_http_core_post_access_phase 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.cngx_int_tngx_http_core_post_access_phase(ngx_http_request_t*r,ngx_http_phase_handler_t*ph){ngx_int_taccess_code;ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r-connection-log,0,post access phase: %ui,r-phase_handler);access_coder-access_code;if(access_code){r-access_code0;if(access_codeNGX_HTTP_FORBIDDEN){ngx_log_error(NGX_LOG_ERR,r-connection-log,0,access forbidden by rule);}if(access_codeNGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}ngx_http_finalize_request(r,access_code);returnNGX_OK;}r-phase_handler;returnNGX_AGAIN;}ngx_http_core_post_access_phase 函数是 NGX_HTTP_POST_ACCESS_PHASE 阶段的检查器 其核心职责是处理在访问控制阶段暂存的拒绝状态码r-access_code。 若该码为 NGX_HTTP_UNAUTHORIZED则执行认证延迟 若为 NGX_HTTP_FORBIDDEN 或其他错误码则记录日志并最终化请求 若拒绝码为零则正常推进到下一阶段。2 详解1 函数签名ngx_int_tngx_http_core_post_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 指向当前在阶段引擎数组中的处理器项2 逻辑流程1 读取暂存的访问拒绝码 2 存在拒绝码 2-1 清零 2-2 NGX_HTTP_FORBIDDEN 2-3 NGX_HTTP_UNAUTHORIZED 2-4 其他 3 无拒绝码1 读取暂存的访问拒绝码{ngx_int_taccess_code;ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r-connection-log,0,post access phase: %ui,r-phase_handler);access_coder-access_code;2 存在拒绝码if(access_code){r-access_code0;if(access_codeNGX_HTTP_FORBIDDEN){ngx_log_error(NGX_LOG_ERR,r-connection-log,0,access forbidden by rule);}if(access_codeNGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}ngx_http_finalize_request(r,access_code);returnNGX_OK;}读取暂存的访问拒绝码检查是否存在拒绝码立即将请求结构体中的 access_code 字段清零。 既然已经提取到局部变量并准备处理原始的标记就应该清除 防止后续内部重定向或子请求再次引用这个过期的状态。如果拒绝原因是 403 Forbidden则记录一条错误级别的日志。 403 通常表示配置的访问规则如 deny明确拒绝了请求 记录日志有助于管理员了解被阻止的访问。如果拒绝原因是 401 则调用 ngx_http_core_auth_delay 执行认证延迟处理。 ngx_http_core_auth_delay 实现了防暴力破解机制 它可能设置一个定时器来推迟发送 401 响应增加攻击成本。 该函数的返回值可能是 NGX_OK 或 NGX_AGAIN 直接作为本函数的返回值传递给阶段引擎。如果拒绝码不是 401 也不是 403理论上很少见但也可能为其它错误码 或者对于 403 在记录日志后统一调用 ngx_http_finalize_request 以该拒绝码终结请求。 逻辑 ngx_http_finalize_request 负责发送对应的 HTTP 错误响应并清理请求。 返回 NGX_OK 告诉阶段引擎停止处理当前请求。 意义 提供最终的拒绝出口确保任何未被特殊处理的拒绝码都能正确终止请求 防止请求意外继续进入内容生成阶段。3 无拒绝码r-phase_handler;returnNGX_AGAIN;}无拒绝码正常推进到下一阶段
ngx_http_core_post_access_phase
发布时间:2026/6/5 12:12:37
1 定义ngx_http_core_post_access_phase 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.cngx_int_tngx_http_core_post_access_phase(ngx_http_request_t*r,ngx_http_phase_handler_t*ph){ngx_int_taccess_code;ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r-connection-log,0,post access phase: %ui,r-phase_handler);access_coder-access_code;if(access_code){r-access_code0;if(access_codeNGX_HTTP_FORBIDDEN){ngx_log_error(NGX_LOG_ERR,r-connection-log,0,access forbidden by rule);}if(access_codeNGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}ngx_http_finalize_request(r,access_code);returnNGX_OK;}r-phase_handler;returnNGX_AGAIN;}ngx_http_core_post_access_phase 函数是 NGX_HTTP_POST_ACCESS_PHASE 阶段的检查器 其核心职责是处理在访问控制阶段暂存的拒绝状态码r-access_code。 若该码为 NGX_HTTP_UNAUTHORIZED则执行认证延迟 若为 NGX_HTTP_FORBIDDEN 或其他错误码则记录日志并最终化请求 若拒绝码为零则正常推进到下一阶段。2 详解1 函数签名ngx_int_tngx_http_core_post_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 指向当前在阶段引擎数组中的处理器项2 逻辑流程1 读取暂存的访问拒绝码 2 存在拒绝码 2-1 清零 2-2 NGX_HTTP_FORBIDDEN 2-3 NGX_HTTP_UNAUTHORIZED 2-4 其他 3 无拒绝码1 读取暂存的访问拒绝码{ngx_int_taccess_code;ngx_log_debug1(NGX_LOG_DEBUG_HTTP,r-connection-log,0,post access phase: %ui,r-phase_handler);access_coder-access_code;2 存在拒绝码if(access_code){r-access_code0;if(access_codeNGX_HTTP_FORBIDDEN){ngx_log_error(NGX_LOG_ERR,r-connection-log,0,access forbidden by rule);}if(access_codeNGX_HTTP_UNAUTHORIZED){returnngx_http_core_auth_delay(r);}ngx_http_finalize_request(r,access_code);returnNGX_OK;}读取暂存的访问拒绝码检查是否存在拒绝码立即将请求结构体中的 access_code 字段清零。 既然已经提取到局部变量并准备处理原始的标记就应该清除 防止后续内部重定向或子请求再次引用这个过期的状态。如果拒绝原因是 403 Forbidden则记录一条错误级别的日志。 403 通常表示配置的访问规则如 deny明确拒绝了请求 记录日志有助于管理员了解被阻止的访问。如果拒绝原因是 401 则调用 ngx_http_core_auth_delay 执行认证延迟处理。 ngx_http_core_auth_delay 实现了防暴力破解机制 它可能设置一个定时器来推迟发送 401 响应增加攻击成本。 该函数的返回值可能是 NGX_OK 或 NGX_AGAIN 直接作为本函数的返回值传递给阶段引擎。如果拒绝码不是 401 也不是 403理论上很少见但也可能为其它错误码 或者对于 403 在记录日志后统一调用 ngx_http_finalize_request 以该拒绝码终结请求。 逻辑 ngx_http_finalize_request 负责发送对应的 HTTP 错误响应并清理请求。 返回 NGX_OK 告诉阶段引擎停止处理当前请求。 意义 提供最终的拒绝出口确保任何未被特殊处理的拒绝码都能正确终止请求 防止请求意外继续进入内容生成阶段。3 无拒绝码r-phase_handler;returnNGX_AGAIN;}无拒绝码正常推进到下一阶段