Apache mod_log_config本身不解析查询参数,需结合expr=正则(推荐)、mod_rewrite设环境变量等方式提取;不可用%{uid}q等伪语法,敏感参数须脱敏。

Apache 的 mod_log_config 模块本身不解析 URL 查询参数(query string),也不能直接提取 ?id=123&token=abc 中的 token 或 id 值。它只能记录原始请求行(如 %r)、完整查询字符串(需手动拼接)、或通过环境变量间接传递——但必须依赖其他模块配合。
要审计特定查询参数(比如 ?uid=, ?debug=, ?callback=),需组合使用 mod_setenvif、mod_rewrite 或 expr= 表达式(Apache 2.4.7+),再将提取结果注入日志字段。
✅ 方法一:用 expr= + 正则从 %{QUERY_STRING}e 提取(推荐,Apache 2.4.7+)
Apache 2.4 支持在 LogFormat 中使用 %{expr=...}s,可对环境变量(包括 QUERY_STRING)做正则匹配:
LogFormat "%h %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \
%{expr=%{QUERY_STRING} =~ /uid=([^&;]+)/ ? $1 : '-'}s \
%{expr=%{QUERY_STRING} =~ /debug=1/ ? 'true' : 'false'}s" audit_qs
CustomLog logs/access_audit.log audit_qs说明:
-
%{QUERY_STRING}e是 Apache 内置环境变量,值为?后面的完整字符串(不含?) - 正则
/uid=([^&;]+)/匹配uid=后第一个&或;前的内容(防截断) -
$1引用捕获组,-为未匹配时的默认值 - 第二个字段判断
debug=1是否存在,输出true/false
日志示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
192.168.1.50 [01/May/2026:09:18:22 +0000] "GET /api/user?id=7&uid=U99X2&debug=1 HTTP/1.1" 200 142 "-" "curl/8.5.0" U99X2 true
⚠️ 注意:
- 需确保
mod_setenvif和表达式支持已启用(通常默认开启) - 查询参数值若含 URL 编码(如
uid=%E4%BD%A0%E5%A5%BD),此方式不会自动解码;如需明文,须由后端解码后通过响应头回传
✅ 方法二:用 mod_rewrite 提前提取并设环境变量
适用于 Apache 2.4 早期版本或需复用逻辑的场景:
# 在 VirtualHost 或目录配置中
RewriteEngine On
RewriteCond %{QUERY_STRING} (?:^|&)uid=([^&;]+)
RewriteRule ^ - [E=LOG_UID:%1]
RewriteCond %{QUERY_STRING} (?:^|&)callback=([^&;]+)
RewriteRule ^ - [E=LOG_CALLBACK:%1]
LogFormat "%h %t \"%r\" %>s %b %{LOG_UID}e %{LOG_CALLBACK}e" uid_callback_log
CustomLog logs/uid_access.log uid_callback_log说明:
-
E=LOG_UID:%1将匹配到的值存入环境变量LOG_UID -
%{LOG_UID}e在日志中读取该变量(e表示 environment) - 若参数不存在,对应位置输出为空(可加
-默认值:%{LOG_UID|'-'}e)
⚠️ 不可行的做法(常见误区)
- ❌ 直接写
%{uid}q或%{QUERY_STRING:uid}e—— Apache 没有q格式符,也不支持键值解析语法 - ❌ 用
%{THE_REQUEST}i然后靠日志分析工具拆分 —— 不可靠,因THE_REQUEST可能被重写、含空格、无结构,且无法区分编码与原始语义 - ❌ 依赖
mod_headers设置响应头再记录 —— 查询参数是请求端行为,响应头是服务端输出,二者无直接映射关系
? 审计建议与安全提醒
- 敏感参数(如
token、auth_code、signature)不应直接记录明文,建议:- 记录哈希(如
sha256($1))而非原文(需 Lua 或外部脚本) - 或仅记录是否存在(
%{expr=%{QUERY_STRING} =~ /token=/}s→true/false)
- 记录哈希(如
- 日志文件权限设为
640,避免非 root 用户读取 - 若启用
mod_ssl,可叠加记录 TLS 版本和客户端 IP(%{SSL_PROTOCOL}x %{REMOTE_ADDR}a),增强上下文
不复杂但容易忽略。

















