如何从服务器端告诉客户端是否支持http / 2

时间:2017-07-11 18:07:41

标签: javascript http2 quic

我正在编写一个将由网络用户使用的分析服务器。我想测试的一个参数是他们的浏览器支持。请告诉我是否可以获取以下信息以及如何:

  • 测试客户端(用户浏览器)是否支持http/2
  • 测试客户端(用户浏览器)是否支持http/2 pushes,有些如何检测服务器何时发送推送,客户端是否能够使用它,这可能是一些js测试,或者你告诉我。
  • 测试客户端(用户浏览器)是否支持QUIC,http / 2的UDP版本

2 个答案:

答案 0 :(得分:1)

这取决于所使用的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; 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时才会设置这些变量。

并非所有Web服务器都像Apache一样轻松地公开这一级别的详细信息,并且许多Web服务器不支持HTTP / 2推送,因此可能无法检测到它们本身不支持它!

我不知道有任何网络浏览器从HTTPS客户端问候消息中提供这些详细信息(当协商HTTP / 2时),因为大多数只提供当前连接的详细信息,而不是每个协议支持,并且仅在设置HTTPS会话之后。例如,Apache的HTTPS变量在此处给出:http://httpd.apache.org/docs/current/mod/mod_ssl.html#envvars

Web服务器不太支持QUIC,因此不容易检测。

从客户端实际检测所有这些更加困难,因为据我所知,这些都没有暴露给JavaScript。最简单的选择是通过HTTP / 2调用CGI脚本,它返回Web服务器提供的那些值的结果。

请注意,只有在需要时才会使用推送的资源。如果需要而不是推动,那么无论如何它都将被取出。因此,您对js测试的想法(可能是检测是否正在使用推送资源)将无法明确说明客户端是否支持推送,因为资源可能已被提取。

答案 1 :(得分:0)

您可以做的最好的事情是通过他们的用户代理确定他们的浏览器,然后将其与某些浏览器和功能数据库交叉引用。

当然,用户代理可以撒谎,但大多数人都会适当地宣布自己。