如何在浏览器的JavaScript中检查服务器是否支持HTTP / 2

时间:2019-05-25 02:05:42

标签: javascript http2

我想知道一种方法,以检查服务器是否在浏览器的JavaScript中支持HTTP / 2。如果可能的话,我想知道不使用API​​服务器的方式。

检查原因如下。

  • 在大多数浏览器中,HTTP / 1请求被限制为6-8个并发请求。
  • 要检测HTTP / 2,并正确提供请求数

4 个答案:

答案 0 :(得分:1)

由于某些原因,这很棘手。

即使服务器支持HTTP / 2,客户端也可能不会使用它。例如,如果代理(通常在公司环境或防病毒产品中使用)可能不支持HTTP / 2 ab,那么尽管客户端和服务器均支持HTTP / 2,但还是强制使用HTTP / 1.1。

即将到来的Resource Timing Level 2 specification提出了一个nextHopProtocol属性,该属性将赋予该属性和support is reasonably good,尽管值得注意的是Safari不支持此属性,因此鉴于iOS的流行可能是相当大的一部分您的网络访问者。另外,它尚未获得批准,因此可能会发生变化。

您还可以检测到该服务器端,因为许多Web服务器在变量中公开了连接信息。这可以用于在主体中设置HTTP标头或响应,以将支持信息告知客户端。

但是,即使您可以准确地衡量此指标,也可能无法像您认为将要使用的并发请求数一样准确。 Google Chrome for example is experimenting with throttling the number of concurrent requests on slow connections。在开发人员工具中使用“慢3G”网络配置文件时,可以从Chrome 74中看到这一点。

答案 1 :(得分:1)

这个问题is a duplicate,所以这里是most upvoted answer from Punit S


Navigation Timing 2 API 提供了以下信息:

performance.getEntriesByType('navigation')[0].nextHopProtocol

上面应该在使用 HTTP 2 获取的页面上返回 'h2'

关于 nextHopProtocol 有限兼容性的说明:

Navigation Timing Level 2 API 目前处于工作草案状态,因此对 nextHopProtocol(随着 Level 2 API 引入)的支持将受到限制(不确定支持它的确切浏览器,因为 caniuse 目前不包括 Navigation Timing Level 2 API)。


(结束语)

我在由 Apache 2.2 提供服务的本地主机站点上测试了上述代码并收到了 "http/1.1"(我不确定如何更改 HTTP 的类型)。在其他网站上,它们都输出了 "h2"(我只测试了几个)。

答案 2 :(得分:0)

我发现的唯一方法是尝试连接并在失败时捕获错误:

const http2 = require('http2')

; (async() => {
  let host = 'https://www.amazon.com'
  const http2Support = await new Promise((resolve, reject) => {
    const client = http2.connect(host)
    client.on('error', (err) => {
      resolve(false)
    })
    client.on('remoteSettings', (settings) => {
      resolve(settings)
    })
  })
  console.log(http2Support)
}

答案 3 :(得分:0)

在大多数情况下,这对您来说是不可见的。如果服务器支持 HTTP/2 并且您使用的是现代浏览器,它会自动发生,前提您的网站是通过 HTTPS 传送的

这意味着除非您提供自己的证书,否则本地测试将始终为 HTTP/1

如果您可以访问服务器,则可以通过查看请求标头来找到答案。来自https://developers.google.com/web/fundamentals/performance/http2#binary_framing_layer

<块引用>

与换行符分隔的明文 HTTP/1.x 协议不同,所有 HTTP/2 通信都被拆分为更小的消息和帧,每个消息和帧都以二进制格式编码。

所以基本上,如果您的标头是二进制的,那么您正在运行 HTTP/2。

@Rojo 的回答也适用于我,在此页面上的 Web 控制台中运行它,(但同样,由于 HTTP 要求,不在本地)