要记录完整请求头,必须启用调试日志并使用 mod_dumpio 模块;若仅需关键头,推荐用 mod_log_config 显式声明字段,兼顾安全与性能。

Apache 默认不记录完整的请求头,只支持按需提取特定字段。要记录完整请求头,必须启用调试级日志并使用 mod_dumpio 模块,而不是靠 mod_log_config 的 %{HeaderName}i 语法——后者只能逐个取值,无法“完整”捕获所有头。
启用 mod_dumpio 记录原始请求头
这是最直接、最可靠的方式,能输出客户端发送的全部请求头(包括顺序、换行、大小写):
- 取消注释配置文件中的模块加载行:
LoadModule dumpio_module modules/mod_dumpio.so - 在虚拟主机或主配置中添加:
DumpIOInput OnDumpIOOutput Off(仅记录请求头,不记录响应头) - 将日志级别调至
debug(Apache 2.4 推荐用dumpio:trace7):LogLevel dumpio:trace7 - 重启 Apache:
sudo systemctl reload apache2
之后所有请求头会以明文形式出现在 error.log 中,例如:
[Sat Jun 06 20:15:22.3457 2026] [dumpio:trace7] [pid 12345] mod_dumpio.c(74): dumpio_in(data-HEAP): Host: api.example.com\r\n
[Sat Jun 06 20:15:22.3458 2026] [dumpio:trace7] [pid 12345] mod_dumpio.c(74): dumpio_in(data-HEAP): X-Request-ID: req-abc123\r\n
[Sat Jun 06 20:15:22.3459 2026] [dumpio:trace7] [pid 12345] mod_dumpio.c(74): dumpio_in(data-HEAP): Authorization: Bearer eyJhbGciOi...
仅记录指定请求头(推荐用于生产环境)
若只需审计几个关键头(如 X-Request-ID、X-Forwarded-For),用 mod_log_config 更轻量、更可控:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 定义自定义日志格式,显式列出所需头:
LogFormat "%h %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Request-ID}i\" \"%{X-Forwarded-For}i\"" custom_headers - 引用该格式:
CustomLog /var/log/apache2/access.log custom_headers - 注意:
%{X-Real-IP}i为空时通常说明上游未透传,不是 Apache 配置问题;优先检查 Nginx 或 CDN 是否转发了该头
处理空值与脱敏敏感头
避免日志中出现大量 - 或泄露密钥:
- 用表达式语法提供默认值(Apache 2.4.7+):
%{expr=%{reqhdr('X-Trace-ID') ?: 'MISSING'}s - 对敏感头做脱敏(如 Authorization):
不能直接记录原始值,应在应用层生成可信 ID 后透传,例如:RequestHeader set X-Auth-User-ID expr=%{reqenv:REMOTE_USER} - 确保日志文件权限为
640,仅限 root 和 syslog 组可读
不建议的做法
以下方式无法真正记录“完整”请求头:
- 试图用
%{ALL_HEADERS}i—— Apache 不支持该伪变量 - 依赖
%r或%{HTTP}i—— 它们只包含部分头或根本不存在 - 仅靠
SetEnvIf提取再记录 —— 仍需提前知道头名,且无法覆盖动态头
mod_dumpio 是唯一能无遗漏捕获全部请求头的机制,但仅适合调试或短期审计;长期运行请坚持“按需提取 + 显式声明”原则。










