这取决于所使用的网络服务器以及它提供的有关连接的详细信息。
例如,Apache 提供以下变量:https://httpd.apache.org/docs/2.4/mod/mod_http2.html#envvars
包括这些变量:
Variable Name: Value Type: Description:
HTTP2 flag HTTP/2 is being used.
H2PUSH flag HTTP/2 Server Push is enabled for this connection and also supported by the client.
H2_PUSHED string empty or PUSHED for a request being pushed by the server.
因此,您可以使用这样的 LogFormat 轻松地将其添加到日志文件中:
LogFormat "%h %l %u %t %{ms}T \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{Content-Encoding}o %{H2_PUSHED}e" combined
然后从日志文件中查看它是否通过 HTTP/2.0 提供服务以及是否被推送。例如:
86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 2 "GET / HTTP/2.0" 200 1700 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br
86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 3 "GET /assets/css/common.css HTTP/2.0" 200 5381 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br PUSHED
这些变量也可用于 CGI 脚本等。请注意,只有在实际使用 HTTP/2 时才会设置这些变量。
并不是所有的网络服务器都像 Apache 那样容易地公开这种级别的细节,而且许多网络服务器不支持 HTTP/2 推送,因此可能无法检测到,因为它们自己不支持它!
我不知道有任何网络浏览器会从 HTTPS 客户端 hello 消息(协商 HTTP/2 时)中提供这些详细信息,因为大多数浏览器只提供当前连接的详细信息,而不是每个协议支持,并且仅在设置 HTTPS 会话之后。例如 Apache 的 HTTPS 变量在这里给出:http://httpd.apache.org/docs/current/mod/mod_ssl.html#envvars
网络服务器对 QUIC 的支持较少,因此不太容易检测到。
据我所知,从客户端实际检测所有这些内容更加困难,因为这些内容并未暴露给 JavaScript。最简单的选择是通过 HTTP/2 调用 CGI 脚本,该脚本返回 Web 服务器提供的这些值的结果。
请注意,只有在需要时才会使用推送的资源。如果需要并且没有推送,那么无论如何都会获取它。所以你关于js测试的想法,大概检测是否正在使用推送的资源并不能明确说明客户端是否支持推送,因为资源可能已被提取。