我想知道一种方法,以检查服务器是否在浏览器的JavaScript中支持HTTP / 2。如果可能的话,我想知道不使用API服务器的方式。
检查原因如下。
答案 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 要求,不在本地)