根据这,包括%H
在您的LogFormat
应该记录 HTTP 协议版本,但是,它似乎不可靠。
例如,可以远程登录到 Web 服务器的 80 端口并发出GET / HTTP/2.0
,这将导致 Apache 将其记录为 HTTP/2.0,但是,考虑到 HTTP2 是二进制协议,并且不能(实际上)由人通过 telnet 执行,这不是有效的 HTTP2 流量。很容易证明上述请求实际上没有被处理,mod_http2
因为如果禁用该模块,则不会发生任何变化,Apache 仍会处理它并仍然误导性地将其记录为 HTTP2。
同样,通过 telnet 到端口 80 并发出GET / HTTP/9.0
将导致 Apache 将请求记录为 HTTP/9.0,即使不存在这样的协议。
我认为我真正想要记录的是流量是否真的被处理mod_http2
,因为该信息应该来自 Apache 本身,并且不容易受到客户端欺骗。Apache 应该知道流量是否击中了该模块,但我还没有找到基于此进行记录的方法。
似乎没有任何相关的内容mod_http2 文档
我在 Ubuntu LTS 20.04.5 上运行 Apache 2.4.41
答案1
HTTP 版本是作为 HTTP 标头的一部分指定的。因此,HTTP 请求中的 HTTP 版本由客户端在 HTTP 请求标头中指定。
是的,有人可以随意设置一个值,但从服务器的角度来看,这应该是无关紧要的:要么建议的值是可以接受的,这意味着服务器将使用它来回复(如果客户端不支持,那就太糟糕了他们!),或者是不可接受的,在这种情况下服务器应该返回 505 错误或类似的错误。