Apache mod_log_config无法直接提取单个Cookie值,仅支持%{Cookie}i记录完整字符串;Apache 2.4+需用expr=结合正则(如/auth_token=(1+)/)从reqhdr('Cookie')中抽取,匹配失败返回'-',并推荐配合CustomLog写入独立审计日志文件。; ↩

Apache 的 mod_log_config 本身不支持直接提取某个 Cookie 的值,只能记录完整的 Cookie 请求头。要审计特定 Cookie(比如 auth_token、session_id),必须借助 Apache 2.4+ 的表达式日志功能(expr=)配合正则匹配。
确认环境支持 expr= 语法
确保你使用的是 Apache 2.4 或更高版本,并已启用 log_config_module(默认开启)。无需额外加载模块,但需确认配置中未禁用表达式支持:
- 检查
httpd -M | grep log_config输出是否含log_config_module - 避免在配置中出现
LogLevel crit级别过低导致表达式错误被静默忽略
用 %{expr=}s 提取指定 Cookie 值
在 LogFormat 中使用 %{expr=...}s,从 Cookie 请求头中捕获目标字段。例如提取 auth_token:
LogFormat "%h %t \"%r\" %>s %{expr=%{reqhdr('Cookie') =~ /auth_token=([^;]+)/ ? $1 : '-'}s" auth_token_audit
-
reqhdr('Cookie')获取原始 Cookie 字符串(如auth_token=abc123; theme=light) -
/auth_token=([^;]+)/匹配等号后、分号前的内容;$1引用第一个捕获组 -
? $1 : '-'表示匹配失败时输出-,避免空字段干扰分析
注意 URL 编码与特殊字符
客户端发送的 Cookie 值可能被 URL 编码(如空格变 +、中文变 %E4%B8%AD),正则无法自动解码:
- 若需解码后再匹配,Apache 本身不提供内置函数,建议在日志分析阶段用工具(如 Python 的
urllib.parse.unquote)处理 - 正则中避免字面量写
;,应统一用[; ]或[^a-zA-Z0-9_\-\.]更稳妥,防止因格式异常漏匹配 - 对含点号、连字符的 Cookie 名(如
user.id),正则需转义或用字符类,例如/user\.id=([^;]+)/
配合 CustomLog 启用审计日志
定义好格式后,单独启用一条审计日志流,避免污染主访问日志:
CustomLog "/var/log/apache2/auth_token.log" auth_token_audit
- 推荐使用独立文件路径,便于权限隔离和日志轮转策略控制
- 如需同时记录多个关键 Cookie(如
auth_token和impersonate_as),可定义多个LogFormat+ 多个CustomLog - 生产环境建议开启
LogFormat中的%{UNIQUE_ID}e字段,方便关联请求链路











