Apache的mod_log_config无法直接提取Cookie中特定键值,仅支持%{Cookie}i记录整条字符串;Apache 2.4+需用expr=结合正则(如/tracking_id=(1+)/)提取,注意URL编码、脱敏及特殊字符处理。; ↩

Apache 的 mod_log_config 本身不支持直接提取 Cookie 中某个键(如 auth_token 或 session_id)的值,只能记录整条 Cookie 请求头。要审计特定 Cookie 键值,必须借助 Apache 2.4+ 的表达式日志功能(expr=),配合正则匹配实现安全、可控的提取。
确认环境支持 expr 和 reqhdr()
确保你使用的是 Apache 2.4 或更高版本,并已启用 log_config_module(默认开启)。无需额外加载模块,但需确认配置中未禁用表达式引擎:
- 检查
httpd -M | grep log_config输出中含log_config_module -
%{reqhdr('Cookie')}s是获取原始 Cookie 头的标准写法,大小写不敏感,等价于%{Cookie}i - 表达式语法必须用
%{expr=...}s格式,不能省略s后缀
用 expr + 正则提取指定 Cookie 值
在 LogFormat 中使用 %{expr=...}s 从 Cookie 头中捕获目标键值。例如提取 tracking_id=xxx:
LogFormat "%h %t \"%r\" %>s %{expr=%{reqhdr('Cookie') =~ /tracking_id=([^;]+)/ ? $1 : '-'}s" tracking_log
说明:
-
reqhdr('Cookie')获取原始请求头字符串,如"theme=light; tracking_id=abc123; lang=zh" -
/tracking_id=([^;]+)/匹配tracking_id=后直到分号或结尾的内容,$1即捕获组 -
? $1 : '-'表示匹配成功取值,失败则记录为短横线,避免空字段干扰解析 - 若 Cookie 值含 URL 编码(如
user%40example.com),该方式不会自动解码,需后续处理
安全与审计注意事项
审计场景下,直接记录原始 Cookie 值存在敏感信息泄露风险,务必做脱敏处理:
- 避免在日志中明文记录
password、token、auth_code等高危键名——可改用占位符,例如:%{expr=%{reqhdr('Cookie') =~ /auth_token=/ ? '***REDACTED***' : '-'}s - 对必须记录的 ID 类字段(如
user_id),建议只记录哈希后缀或截断(如取后6位):%{expr=%{reqhdr('Cookie') =~ /user_id=([^;]+)/ ? substr($1, -6) : '-'}s - 注意特殊字符:Cookie 值可能含空格、双引号、换行符,Apache 日志默认不转义,建议配合
CustomLog的pipe方式交由外部工具清洗
替代方案:用 mod_headers + SetEnvIf 预处理
若正则提取不稳定(如多值同名 Cookie 或格式混乱),更健壮的做法是先用 mod_setenvif 提取并设环境变量,再写入日志:
<IfModule mod_setenvif.c><br> SetEnvIf Cookie "(^|;\s*)user_id=([^;]+)" USER_ID=$2<br></IfModule><br>LogFormat "%h %t \"%r\" %>s %{USER_ID}e" user_audit<br>CustomLog /var/log/apache2/user-audit.log user_audit
优点:
- 逻辑清晰,调试方便;
SetEnvIf支持更灵活的模式匹配 - 环境变量
%{USER_ID}e可被其他模块复用(如限流、重写) - 天然规避正则嵌套和转义问题


















