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

如何在浏览器上检查服务器是否支持JavaScript中的HTTP/2,javascript,http2,Javascript,Http2,我想知道如何在浏览器中检查服务器是否支持JavaScript中的HTTP/2。如果可能的话,我想知道不使用API服务器的方法 检查的原因如下 在大多数浏览器中,HTTP/1请求被限制为6-8个并发请求 检测HTTP/2,并正确提供请求数 出于几个原因,这是一个棘手的问题 即使服务器支持HTTP/2,客户端也可能不使用它。例如,如果代理(通常用于公司环境或防病毒产品)可能不支持HTTP/2 abs,则强制使用HTTP/1.1,尽管客户端和服务器都支持HTTP/2 即将发布的版本中提出了一个属性,

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

检查的原因如下

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

    • 出于几个原因,这是一个棘手的问题

      即使服务器支持HTTP/2,客户端也可能不使用它。例如,如果代理(通常用于公司环境或防病毒产品)可能不支持HTTP/2 abs,则强制使用HTTP/1.1,尽管客户端和服务器都支持HTTP/2

      即将发布的版本中提出了一个属性,可以提供这种功能,不过值得注意的是,Safari不支持这种功能,因此考虑到iOS的普及率,iOS可能会占web访问者的很大一部分。加上它还没有被批准,所以可能会改变

      您还可以检测此服务器端,因为许多web服务器在变量中公开连接信息。这可用于在主体中设置HTTP头或响应,以通知客户机支持


      然而,即使您能够准确地测量这一点,它也可能不像您所认为的将要使用的并发请求的数量那样准确。在开发者工具中使用“慢速3G”网络配置文件时,可以从Chrome 74中看到这一点。

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

      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)
      }
      
      这个问题,这里是:


      导航计时2 API提供以下信息:

      performance.getEntriesByType('navigation')[0].nextHopProtocol
      
      上面应该在使用HTTP 2获取的页面上返回“h2”

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

      导航计时级别2 API当前处于工作草稿状态,因此对下一个PProtocol(该协议是随着级别2 API引入的)的支持将受到限制(由于caniuse当前不包括导航计时级别2 API,因此不确定支持它的确切浏览器)


      (完)


      我在Apache2.2提供服务的本地主机站点上测试了上述代码,收到了
      “http/1.1”
      (我不确定如何更改http的类型)。在其他网站上,他们都输出了“h2”(我只测试了少数)。

      在大多数情况下,这对你来说是不可见的。如果服务器支持HTTP/2,并且您使用的是现代浏览器,那么如果您的网站是通过HTTPS交付的,那么这种情况将自动发生

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

      如果您有权访问服务器,一种查找方法是查看请求头。发件人:

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

      因此,基本上,如果您的头是二进制的,那么您正在运行的HTTP/2


      @Rojo的答案也适用于我,在本页的web控制台中运行它(但是,由于HTTP要求,不是本地的)

      这是否回答了您的问题?