apache默认不直接记录http协议版本,http/1.x可用%{the_request}i提取,http/2推荐用%h或%{http2}e,http/3暂无原生支持。

Apache 默认不直接记录 HTTP 协议版本(如 HTTP/1.1、HTTP/2、HTTP/3),但可通过组合配置和模块支持,从日志中可靠获取请求所用的实际协议信息。关键在于区分协议类型、启用对应模块,并选用正确的日志格式符。
HTTP/1.x 请求:用 %{THE_REQUEST}i 提取原始请求行
HTTP/1.x 明文传输,请求行包含协议标识,例如 GET /api/user HTTP/1.1。可使用:
- %{THE_REQUEST}i:记录完整原始请求行,适用于所有 HTTP/1.x 场景
- %{REQUEST_LINE}i:效果类似,但依赖请求已成功解析,部分旧版 Apache 可能不支持
⚠️ 注意:该方式对 HTTP/2/3 无效——它们不发送明文请求行,THE_REQUEST 在 HTTP/2 下常被伪造成 HTTP/1.1,不可信。
HTTP/2 请求:用 %H 或 %{HTTP2}e 获取真实协议
需确保已启用 mod_http2(Apache 2.4.17+ 官方支持):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- %H:最推荐。自动输出实际协商的协议版本,如 HTTP/2.0 或 HTTP/1.1
- %{HTTP2}e:环境变量方式,值为 on(HTTP/2)或空(非 HTTP/2),适合条件日志标记
示例日志格式:LogFormat "%h %t \"%r\" %H %>s %b" http_proto_log
这样每条日志开头就能看到真实协议。
HTTP/3 请求:当前无原生支持,需间接推断
截至 Apache 2.4.x 稳定版,mod_log_config 尚未提供 HTTP/3 专用字段。变通方法有限且不完全可靠:
- 检查 TLS ALPN 协商结果,如通过
%{SSL_PROTOCOL}e或自定义匹配h3字符串 - 配合
SetEnvIf设置环境变量(如SetEnvIf ALPN h3 is_http3),再用%{is_http3}e记录
该方式依赖底层 QUIC 实现(如第三方补丁),稳定性差。建议关注 Apache 2.5 开发进展,HTTP/3 日志支持正在推进中。
验证是否生效的实用步骤
配置后务必验证,避免误判:
- 运行
httpd -M | grep -E "(log_config|http2|ssl)",确认mod_log_config、mod_http2、mod_ssl均已加载 - 用
curl -I --http2 https://yoursite.com和--http1.1分别发起请求 - 检查日志中
%H字段是否随请求协议变化而改变(如显示HTTP/2.0vsHTTP/1.1) - 若始终为
HTTP/1.1,重点排查mod_http2是否启用、SSL 配置是否开启 ALPN










