【问题标题】:How to check if a website has HTTP/2 protocol support如何检查网站是否支持 HTTP/2 协议
【发布时间】:2019-06-03 03:10:00
【问题描述】:

有很多关于HTTP/2协议的话题,但我想知道是否有使用该协议的工作网站。

我们可以决定使用http://https://,但是我们如何编写HTTP/2请求呢?

我知道此协议取决于服务器功能,但我找不到检查网站是否存在的方法,例如google.com,已启用 HTTP/2 支持。

正如我在这张图片中看到的,所有现代浏览器都支持该协议。 我还没有看到任何看起来像新一代协议的链接。

我们是在不知不觉中使用HTTP/2协议还是只是一个童话?

【问题讨论】:

  • 这不是你的决定。协议版本取决于远程服务器的兼容性。 http2:// 没有任何意义,因为它仍然是相同的 http 协议,只是另一个版本。拥有一个http:// uri 使回退成为可能,因此如果可能,使用版本 2,否则回退到 v1。
  • @emix 但是如果http2:// 可用,它会不会有意义?如果不是,请在前面加上https://。我的意思是使用这个理论没有理由在前面加上https:// 对吗?不是想成为一个聪明人,我只是好奇。

标签: protocols http2 browser-support


【解决方案1】:
curl -I --http2 -s https://domain.url/ | grep HTTP

【讨论】:

  • 如果您提供解释为什么这是首选解决方案并解释它是如何工作的,它会更有帮助。我们想要教育,而不仅仅是提供代码。
  • 在某些站点上,这会输出 HTTP/2 200,而在其他一些站点上,则输出 HTTP/1.1 200 OK。你的意思是建议解析这个命令的输出吗?
【解决方案2】:

使用curl 命令作为现有 curl 解决方案的解决方案对我来说效果不佳。 curl 提供了一个开关 --http2-prior-knowledge,它确保直接发送 HTTP/2 请求而不尝试 HTTP/1.1 升级请求。下面的例子可以帮助理解不同情况下的行为:

Curl to Google 支持 HTTP/2 - 自动选择 HTTP/2。

curl -Iks https://www.google.com/robots.txt

HTTP/2 200 
accept-ranges: bytes
vary: Accept-Encoding
content-type: text/plain
content-length: 7199
cross-origin-resource-policy: cross-origin
date: Fri, 21 May 2021 13:39:02 GMT
expires: Fri, 21 May 2021 13:39:02 GMT
cache-control: private, max-age=0

Curl 到我的不支持 HTTP/2 的服务器 - 响应状态为 HTTP/1.1

curl -Iks https://myserver/reset
HTTP/1.1 502 Bad Gateway
connection: close
content-length: 0

使用--http2 切换到我的服务器。响应仍然显示 HTTP/1.1

curl -Iks --http2 https://myserver/reset
HTTP/1.1 502 Bad Gateway
connection: close
content-length: 0

使用--http2-prior-knowledge 转至我的服务器。请注意,未获得任何响应。

curl -Iks --http2-prior-knowledge https://myserver/reset

如果使用v 开关(详细)执行上述操作,则输出将包括以下行。

* http2 error: Remote peer returned unexpected data while we expected SETTINGS frame.  Perhaps, peer does not support HTTP/2 properly.

注意:

  • 开关k 用于insecure - 我的服务器使用自签名证书。否则不需要。
  • 切换I是发送HEAD请求,避免输出噪音。
  • 以上是在 Ubuntu 18.04 上使用 curl 7.58.0 捕获的

【讨论】:

    【解决方案3】:

    使用 F12 在 Chrome 中打开 开发工具。然后转到网络标签。

    右键单击一行,选择Header Options,然后从菜单中选择Protocol

    【讨论】:

    • “h3”是什么协议?
    • @oᴉɹǝɥɔ HTTP/3
    【解决方案4】:

    您还可以使用名为 HTTP/2 and SPDY indicator 的酷炫 Chrome/Firefox 扩展程序来检查网站协议。

    【讨论】:

      【解决方案5】:

      您可以直接在:Chrome 开发工具 (F12) → 网络协议中查看。

      它会告诉你使用的协议和每次传输的域。

      传说

      http/1.1 = HTTP/1.1
      h2          = HTTP/2


      注意:如果您看不到协议列,只需右键单击任何标题并检查“协议”标签。

      【讨论】:

      • 我必须右键单击标题并将“协议”添加为可见标题。直到 Chrome 开发工具 > 网络中可以添加更多列。
      • 必须右键单击名称标题,其他列无法右键单击。 ?
      • 我的有点特别,不管查什么,我看到的唯一一列就是name。有任何想法吗?我还发现,如果单击响应标头部分中的“查看源代码”,该协议是可见的。
      【解决方案6】:

      打开浏览器开发工具并切换到网络选项卡。如果 HTTP/2 可用,您将在此处看到 h2

      【讨论】:

      • 3分钟没找到,能分享一下截图吗
      【解决方案7】:

      您可以使用curl 命令查看特定网站是否支持 HTTP/2 协议。在以下示例中,只需将 https://www.cloudflare.com/ 替换为您要检查 HTTP/2 支持的 URL:

      % curl -vso /dev/null --http2 https://www.cloudflare.com/
      

      如果您在输出消息中看到offering h2,则表示给定的 URL 支持 HTTP/2。例如:

      ....
      * ALPN, offering h2
      * ALPN, offering http/1.1
      ....
      

      【讨论】:

      • 在我的终端上,线路在大量未知的 TLS 中丢失。 curl -vso /dev/null --http2 https://www.cloudflare.com/ 2>&1| grep "offering h2"
      • 谢谢,@blueray。你拯救了我的日子。我只是想了解'-vso'关键字的含义。我在 Google 上尝试过,但没有得到任何结果。
      • 对任何 https url 运行 curl 将默认尝试建立 http2 连接。据我所知,"...offering h2" 表明客户端而不是服务器愿意使用 http2。运行 curl -vso /dev/null --http2 https://site.i.know.does.not.support.http2 always 返回“offering h2”。我发现运行 curl -sI https://site.i.want.to.test -o /dev/null -w '%{http_version}\n' 可以更可靠地表明 http2 支持。
      • @terryf82 请检查HTTP/2 with curlTLS in HTTP/2。我的答案是检查“网站是否支持 HTTP/2 协议”。您的命令是找出“有效使用的 http 版本”。
      【解决方案8】:

      HTTP/2 重用了 http:// 和 https:// 方案,而不是使用新的方案。

      所有浏览器仅支持 HTTP/2 over https:// 并且 SSL/TLS 协商的一部分是沟通双方是否支持 HTTP/2 并愿意使用它(使用称为 ALPN 的 SSL/TLS 扩展) .

      这样做的好处是您只需连接到一个网站,如果您的浏览器支持它,它将自动协商 HTTP/2,如果不支持,它将自动回退到 HTTP/1.1。

      因此,要测试 HTTP/2 支持,您可以按照 Markus 的建议使用浏览器(例如,确保将“协议”列添加到 Chrome 的“网络”选项卡中)。

      或者您可以使用在线测试仪,例如https://tools.keycdn.com/http2-test

      或者您可以使用 openssl 之类的命令行工具(假设它是使用 ALPN 支持构建的):openssl s_client -alpn h2 -connect www.example.com:443 -status

      大多数大型网站(例如 Twitter、Facebook、Amazon、Stack Overflow)现在都在使用 HTTP/2。

      【讨论】:

      • 您提到浏览器可以从 HTTP/2 开始,如果服务器不支持 HTTP/2,可以切换回 HTTP/1.1。如果客户端不支持 HTTP/2 怎么办?单个服务器能否同时提供 HTTP/1.1 和 HTTP/2。我希望通过一个 tomcat 实例来支持这两个版本。
      • 与其说是从 HTTP/2 开始然后切换回来。发生的情况是浏览器打开 HTTPS 连接并说“我支持这个版本的 TLS、这些密码和 HTTP/2 - 让我知道其中哪些适合你”,然后服务器决定使用它们的最佳设置理解。如果浏览器说它支持 HTTP/2 并且服务器也支持,那么它会使用它。如果浏览器没有说它会支持它,但服务器做了,那么它将使用 HTTP/1.1。如果浏览器说它支持它并且服务器就像“你说的这个 HTTP/2 是什么?”然后它会忽略它并使用 HTTP/1.1。
      • 所以是的,服务器应该支持这两个实例并使用合适的。我们离一个只支持 HTTP/2 的世界很远很远,并且将在很长很长一段时间内为某些连接处理 HTTP/1.1。
      • 谢谢你提到的几点我明白了。我的问题还是一样,单台服务器能否同时支持 HTTP/2 和 HTTP/1.1。对于 tomcat,建议在 server.xml 中进行更改以使用 HTTP/2。如果这样做,那个 tomcat 实例能否处理 HTTP/1.1 流量,因为我听说 HTTP/2 不向后兼容。
      • 我自己不要使用 Tomcat,而且快速谷歌的文档对此并不完全清楚,但如果添加 HTTP/2 支持禁用 HTTP/1.1 支持,我会感到非常惊讶。
      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 2017-07-21
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多