可直接用%{header-name}i语法提取请求头,需在logformat中显式声明,注意连字符原样保留、大小写不敏感;header不存在时输出“-”;代理场景须确保其透传至apache。

可以直接用 %{Header-Name}i 语法在 LogFormat 中提取请求头,无需额外模块,但必须显式声明、注意大小写与连字符规范,并确认 Header 真实到达 Apache。
正确配置 LogFormat 提取自定义请求头
Apache 默认日志格式(如 %r、%s)不包含任意请求头,必须手动添加 %{X-Request-ID}i 这类格式符:
-
i表示 input(即客户端发来的请求头),名称区分大小写不敏感,但连字符-必须原样保留,例如写%{X-Forwarded-For}i,不能简写为%{x-forwarded-for}i(虽能识别,但可读性差、易出错) - 推荐定义带自定义头的新日志格式,例如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Request-ID}i\" \"%{X-Debug}i\"" audit_with_headers - 该格式名(如
audit_with_headers)需在CustomLog中引用才生效,否则不会输出对应字段 - 若请求中不存在该 Header,对应位置固定输出破折号
-,不是空字符串或缺失字段,这对日志解析和审计脚本很关键
排查 Header 未记录的常见原因
日志里始终显示 -,大概率不是 Apache 配置问题,而是 Header 根本没传到 Apache:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 前端代理(如 Nginx、CDN 或负载均衡)可能剥离或未透传该 Header;可用
curl -H "X-Request-ID: abc123" http://your-site/直连 Apache 测试是否捕获 - 防火墙、WAF 或中间网络设备可能过滤非常规 Header;检查 Apache 接收请求时是否真有该字段(可通过
ErrorLog+%{X-Request-ID}i短日志临时验证) - 多层代理下,Header 可能被重写(如
X-Real-IP被覆盖),优先使用更通用的X-Forwarded-For或平台专用头(如 Cloudflare 的True-Client-IP)
按 Header 值做条件审计(只记特定请求)
全量记录所有请求头可能冗余,审计常需聚焦关键行为,比如只记录开启调试的请求:
- 用
SetEnvIfNoCase匹配请求头值并设环境变量:SetEnvIfNoCase X-Debug "true" DEBUG_REQ - 再结合
%{DEBUG_REQ}e在 LogFormat 中标记,或用CustomLog ... env=DEBUG_REQ实现条件日志(仅当环境变量存在时才写入该条日志) - 也可组合多个条件,例如同时匹配
X-Admin: 1和Request_Method = POST,精准捕获高危操作
注意事项与边界说明
这类审计只适用于请求头(%{...}i),不适用于响应头:
-
%{X-My-Header}o在标准 Apache 2.4 中无法可靠工作,官方未实现通用响应头日志支持 - 如需记录 Java 后端返回的响应头(如
X-Process-Time),应由应用层主动注入到请求上下文,或改用mod_lua+%{...}n(notes)方式间接传递 - 日志中的 IP 字段(
%h)默认是 TCP 远端地址,若经代理,需配合mod_remoteip模块信任X-Forwarded-For才能还原真实客户端 IP,否则审计溯源会失真










