apache请求处理划分为8个固定顺序逻辑阶段:post_read_request、uri_translation、map_to_storage、header_parse、access_checker、check_user_id、auth_checker,以及fixups/response/logging/cleanup收尾四阶段。

Apache 的请求处理不是“一步到位”,而是被划分为8 个逻辑阶段(部分资料表述为 7 或 11 个,差异源于归类粒度不同;当前主流、最细粒度且被源码和官方文档支持的划分是 8 阶段模型)。理解这 8 个阶段,等于掌握了 Apache 如何“一步步把一个 URL 变成一个网页”的内在节奏——每个阶段职责明确、顺序固定、模块可插拔。
post_read_request:请求刚进门的第一步
这是整个生命周期中最早触发的钩子,发生在 Apache 刚读完原始 HTTP 请求行和头部、构造出 request_rec 结构体之后,但所有路径解析和配置还没开始。
- 主要用途:做最底层的预处理,比如强制重定向到 HTTPS、修改原始请求行、记录原始字节流等。
- 常见模块:
mod_ssl(检查是否需升级协议)、自定义安全模块(如拦截异常 User-Agent)。 - 注意:此时
URI还未解码,filename字段为空,不能做路径相关判断。
uri_translation:把 URL “翻译”成服务器能懂的语言
核心任务是将客户端发来的 /blog/post.php?id=123 这类 URI,映射为服务器内部可操作的路径或指令。
- 执行关键动作:URL 解码(
%20→ 空格)、清理路径(/../→ 上级目录)、应用Alias/Redirect/RewriteRule。 - 模块主力:
mod_alias、mod_rewrite、mod_proxy(遇到ProxyPass会在此阶段标记为代理请求)。 - 重要结果:生成
filename字段(如/var/www/html/blog/post.php)或设为proxy:xxx。
map_to_storage:确认资源“落脚点”在哪
Apache 要判断这个请求最终对应的是磁盘文件、动态处理器,还是代理后端。
- 若
filename已存在且是普通文件,就进入静态资源流程; - 若
filename是.php但启用了mod_php,则准备交由 PHP 处理器; - 若
filename以proxy:开头,则跳过文件系统检查,直接进代理流程。 - 安全意义:此阶段会触发
Require all denied类配置的实际生效,也是Options FollowSymLinks等权限检查发生的位置。
header_parse:拆开 HTTP 头,提取关键信息
对已接收的请求头(Host、Accept、Cookie、Authorization 等)进行语法校验与语义解析。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不只是“读取”,还会做标准化:如合并重复的
Accept头、规范化Host大小写、提取Authorization中的 base64 凭据。 - 模块典型:
mod_setenvif(根据User-Agent设置环境变量)、mod_headers(修改/删除头)、mod_ssl(提取 SNI 主机名)。
access_checker:拦在门口的“门禁系统”
基于 IP、域名、连接数、地理位置等网络层条件做粗粒度放行/拒绝。
- 配置关键词:
Require ip 192.168.1.0/24、Require host example.com、LimitRequestFields 50。 - 特点:不涉及用户身份,只看“你是谁(从哪来)”,不问“你登录没”。
- 失败直接返回 403,不进下一阶段。
check_user_id:验证“你是谁”
启动身份认证流程,解决“这个请求背后是不是某个注册用户”的问题。
- 触发条件:配置了
AuthType Basic或AuthType Digest,且上一阶段允许进入。 - 模块工作:
mod_auth_basic读取.htpasswd,mod_auth_digest校验摘要值,mod_authn_dbd查数据库。 - 成功后,
r->user和r->ap_auth_type字段被填满;失败则返回 401。
auth_checker:判定“你能干啥”
即使知道你是张三,也要查查张三有没有权限访问 /admin/ 这个目录。
- 执行
Require user alice、Require group editors、Require ldap-group cn=devs,ou=groups等细粒度授权规则。 - 可结合外部服务:
mod_authz_dbd(查 DB)、mod_authz_ldap(查 LDAP)。 - 此阶段失败也返回 403,但含义是“身份正确,权限不足”。
fixups + response + logging + cleanup:收尾三连
这三个阶段常被合并讨论,但实际是四个独立环节,合起来构成“善后闭环”:
-
fixups:最后的“临门一脚”。比如
mod_expires设置缓存头、mod_headers补充X-Frame-Options、mod_security做最终请求体扫描。 -
response:调用 handler(
default-handler、mod_php、proxy_fcgi等)生成响应体,并设置Content-Type、Content-Length。 -
logging:
mod_log_config写入 access log,mod_security写 audit log,时间戳精确到微秒。 -
cleanup:释放内存池、关闭临时文件句柄、销毁
request_rec对象——该请求彻底结束,不留痕迹。
Apache 的 8 阶段本质是控制权移交表:每个阶段像一道安检门,模块按需“刷卡入场”。你改一行 .htaccess,可能就悄悄激活了其中某几个阶段的某个钩子。掌握它,调试 403、500、重定向循环才真正有底气。










