apache 2.4.13+ 可用 %{expr=}s 结合正则从 cookie 头安全抽取指定值(如 auth_token),需确认版本与 log_config_module 已启用,避免使用已废弃的 mod_usertrack。

Apache 的 mod_log_config 本身不支持直接提取某个 Cookie 名称(如 auth_token 或 session_id)的值,它只能记录完整的 Cookie 请求头。但 Apache 2.4+ 提供了基于表达式的日志格式(expr=),配合正则匹配,可以安全、稳定地抽取特定 Cookie 值用于审计目的。
确认环境支持 expr 语法
确保你使用的是 Apache 2.4.13 或更高版本,且 log_config_module 已启用(默认开启)。无需额外加载模块,但需避免使用已废弃的 mod_usertrack(它在 2.4 中不可用,且与审计目标无关)。
- 运行
apache2ctl -M | grep log_config确认模块已加载 - 检查
httpd -v输出版本号 - 不要配置
CookieTracking on—— 这会引发错误或无效输出
用 %{expr=}s 抽取指定 Cookie 值
在 LogFormat 中使用 %{expr=...}s,从 %{reqhdr('Cookie')} 字符串中匹配目标键值对。注意 URL 编码、分号分隔和空格处理。
例如,提取名为 auth_token 的 Cookie 值:
LogFormat "%h %t \"%r\" %>s %{expr=%{reqhdr('Cookie') =~ /auth_token=([^;]+)/ ? $1 : '-'}s" auth_audit
-
/auth_token=([^;]+)/匹配auth_token=xxx直到下一个分号或结尾 -
$1引用正则第一个捕获组(即真实值) -
? $1 : '-'表示未匹配时记为短横线,便于后续过滤
若 Cookie 值含 URL 编码(如 auth_token=a%2Fb%3Dc),Apache 不自动解码;如需明文审计,应在应用层解码,或改由后端日志统一处理。
记录多个 Cookie 并做脱敏处理
审计常需同时追踪多个敏感字段(如 user_id、tenant_id),也可对高危值做简单掩码:
LogFormat "%h %t \"%r\" %>s \
%{expr=%{reqhdr('Cookie') =~ /user_id=([^;]+)/ ? substr($1,0,4) .. '****' : '-'}s \
%{expr=%{reqhdr('Cookie') =~ /tenant_id=([^;]+)/ ? $1 : '-'}s" multi_cookie_audit
- 用
substr($1,0,4) .. '****'实现前四位可见、其余掩码(仅限字符串) - 避免在日志中记录明文密码、token 私钥等——应由前端或网关过滤
- 建议搭配
CustomLog单独写入审计专用日志文件,便于权限隔离
验证与常见问题
配置后重启 Apache,并用带 Cookie 的请求测试(如 curl -H "Cookie: user_id=abc123; auth_token=xyz789" http://localhost/)。
- 日志中出现
-:说明正则未匹配,检查 Cookie 名拼写、大小写、是否被客户端省略 - 整行为空或报错:确认 Apache 版本、检查
expr=语法括号是否闭合、避免使用未定义变量 - 值含空格或特殊字符(如
theme=dark mode):正则需改用/theme=([^;]*)/并注意引号包裹日志格式
不复杂但容易忽略细节,关键是用对 expr + 正则,而不是依赖过时模块。











