Apache默认日志不记录QUERY_STRING,需用%{QUERY_STRING}i自定义LogFormat;该变量在2.2+版本原生支持,记录原始编码字符串如name=%E5%BC%A0%E4%B8%89&id=123,解析应延至日志分析阶段。

Apache 默认日志格式(如 combined)不记录完整的 QUERY_STRING,只记录请求行中的 URI 路径部分(例如 /search),而问号及其后的参数(如 ?q=apache&sort=recent)被截断。要完整记录 QUERY_STRING,需主动配置 LogFormat 并确保变量可用。
确认 QUERY_STRING 变量是否可用
Apache 官方文档中 %{QUERY_STRING}i 是标准且受支持的变量,表示客户端发送的原始查询字符串(未解码、不含问号)。它在所有现代 Apache 版本(2.2+)中都可用,无需额外模块。
-
%{QUERY_STRING}i:推荐使用,直接获取key=val&foo=bar这样的原始字符串 -
%{requri}e:返回整个请求 URI(含路径和 query),例如/search?q=apache&sort=recent,需自行提取 query 部分 -
%{THE_REQUEST}i:返回原始请求行,如GET /search?q=apache&sort=recent HTTP/1.1,但解析复杂、易受空格或编码干扰,不建议用于稳定日志
配置 LogFormat 记录完整 QUERY_STRING
在 Apache 配置文件(如 /etc/apache2/apache2.conf 或虚拟主机配置中)添加自定义日志格式:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{QUERY_STRING}i\"" query_combined
CustomLog ${APACHE_LOG_DIR}/access.log query_combined
重启 Apache 后,日志中对应字段将显示类似 q=apache&sort=recent 的完整字符串。
- 若某次请求无查询参数(如访问
/home),该字段为空白,可加默认值:\"%{QUERY_STRING}i\"→\"%{QUERY_STRING}i-(末尾加短横表示缺失) - 注意:QUERY_STRING 中的
&在日志中是字面量&,不是 HTML 实体;解析时按原样处理即可
处理中文、空格等 URL 编码字符
QUERY_STRING 中的中文、空格等会被编码为 %E4%B8%AD、%20 等形式,Apache 不自动解码。日志中记录的是原始编码串,这是正确行为。
- 分析阶段再统一解码更安全(例如用 Python 的
urllib.parse.unquote) - 不要尝试在 Apache 层用 mod_rewrite + env 变量“先解码再记录”,既增加开销,又可能因编码不规范导致截断或乱码
- 如需在日志中看到可读值,应由后端应用解析后设响应头(如
X-Logged-QS-Readable),再用%{X-Logged-QS-Readable}o记录——但这属于业务层增强,非 QUERY_STRING 原生记录需求
验证与调试技巧
快速确认配置是否生效:
- 发起测试请求:
curl "http://localhost/test?name=张三&id=123" - 查看最新日志:
tail -n 1 /var/log/apache2/access.log - 检查最后一列是否为
name=%E5%BC%A0%E4%B8%89&id=123 - 若为空,检查是否遗漏
CustomLog指向新格式,或配置未重载(运行sudo systemctl reload apache2)

















