【问题标题】:How to check whether server supports HTTP/2 in JavaScript on browser如何在浏览器的 JavaScript 中检查服务器是否支持 HTTP/2
【发布时间】:2019-10-11 13:23:32
【问题描述】:

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

检查原因如下。

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

【问题讨论】:

标签: javascript http2


【解决方案1】:

在大多数情况下,这对您来说是不可见的。如果服务器支持 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 要求,不在本地)

【讨论】:

    【解决方案2】:

    这个问题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"(我只测试了几个)。

    【讨论】:

      【解决方案3】:

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

      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)
      }
      

      【讨论】:

        【解决方案4】:

        这很棘手,原因有几个。

        即使服务器支持 HTTP/2,客户端也可能不会使用它。例如,如果代理(通常用于企业环境或防病毒产品)可能不支持 HTTP/2 abs,那么尽管客户端和服务器都支持 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。在开发者工具中使用“Slow 3G”网络配置文件时,从 Chrome 74 可以看出这一点。

        【讨论】:

          猜你喜欢
          • 2014-04-12
          • 1970-01-01
          • 2020-01-04
          • 2018-06-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-07
          相关资源
          最近更新 更多