这取决于所使用的Web服务器以及其提供有关连接的详细信息。例如,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提供,并且是否已经PUSHED。例如:
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
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
这些变量也可用于CGI脚本等。请注意,仅当实际使用HTTP/2时才会设置这些变量。
并非所有的Web服务器像Apache一样容易公开此级别的细节,许多服务器不支持HTTP/2推送,因此可能无法检测到它们自己不支持的协议。
据我所知,没有任何Web浏览器从HTTPS客户端hello消息(当HTTP/2将被协商时)提供这些详细信息,因为大多数浏览器只提供
当前连接的详细信息,并且仅在HTTPS会话建立后才提供详细信息。例如,Apache的HTTPS变量在此处给出:
http://httpd.apache.org/docs/current/mod/mod_ssl.html#envvars
由于QUIC得到的Web服务器支持较少,因此难以检测。
要从客户端实际检测到所有这些内容更加困难,因为据我所知,这些内容不会暴露给JavaScript。最简单的方法是通过HTTP/2调用一个CGI脚本,该脚本返回Web服务器提供的这些值的结果。
请注意,只有在需要时才会使用推送资源。如果需要但未被推送,则仍将获取它。因此,您对JS测试的想法,可能检测到是否正在使用推送资源,不能确定客户端是否支持推送,因为该资源可能已被获取。