如何检查网站是否支持HTTP/2协议

172
有很多关于HTTP/2协议的主题,但我想知道是否有一个使用此协议的工作网站。
例如,
我们可以决定使用http://https://,但如何编写HTTP/2请求?
我知道这个协议取决于服务器能力,但我找不到一种方法来检查一个网站(例如google.com)是否启用了HTTP/2支持。

HTTP/2 browser support

从这张图片中可以看出,所有现代浏览器都支持该协议。 我没有看到任何可能看起来像新一代协议的链接。

我们是在不知情的情况下使用HTTP/2协议吗?还是这只是一个童话故事?


4
这不是你的决定。协议版本取决于远程服务器的兼容性。使用http2://没有任何意义,因为它仍然是相同的http协议,只是另一个版本。使用一个http:// uri 可以实现回退,如果可能使用版本2,否则回退到v1。 - Mike Doe
1
@emix 但是如果可用的话,前置 http2:// 不是更合理吗?如果不可用,则前置 https://。我的意思是按照这个理论,没有理由前置 https://,我只是好奇而已,不想表现得聪明。 - JΛYDΞV
10个回答

293
你可以在Chrome开发者工具(按下F12键)中查看:Network(网络)→ Protocol(协议)。
它会告诉你使用的协议以及每个传输的域名。

Chrome Dev Tool (F12) -> Network -> Protocol

传说

http/1.1 = HTTP/1.1
h2          = HTTP/2
h3          = HTTP/3


请注意:如果您看不到“协议”列,请右键单击任何标题并勾选“协议”标签。

68
我需要右键点击标头并将“协议”添加为可见标头。今天我学到了在Chrome Dev Tool > Network中可以添加更多列。 - rinogo
3
其他列没有右键点击,必须在“名称”标题上右键点击。 - Michael Dimmitt
1
我的有点特殊,无论勾选什么,我只看到一个名字列。有什么想法吗?我还发现,如果我在响应头部分点击“查看源代码”,协议就可见了。 - lovrodoe

79
你可以使用 curl 命令来查看特定网站是否支持 HTTP/2 协议。在下面的示例中,只需将 https://www.cloudflare.com/ 替换为你想要检查 HTTP/2 支持的网址即可。
% curl -vso /dev/null https://www.cloudflare.com/ 2>&1 | grep ALPN

如果你看到类似的输出:
* ALPN: offers h2,http/1.1
* ALPN: server accepted h2

offers h2,http/1.1 意味着该网站支持HTTP/2协议。

server accepted h2 意味着您正在使用HTTP/2。

ALPN是预期用于HTTP/2的TLS扩展。

还请注意:

当curl通过HTTPS使用HTTP/2时,即使规范要求使用TLS 1.2或更高版本,curl本身并不坚持这个要求。用户可以通过添加--tlsv1.2来设置此版本要求。

您还可以使用--http2-prior-knowledge--http2


2
在我的终端上,这些行被大量未知的TLS所淹没。 curl -vso /dev/null --http2 https://www.cloudflare.com/ 2>&1| grep "offering h2" - Programmer
谢谢,@blueray。你救了我的日子。我只想了解“-vso”关键字的含义。我在Google上尝试了一下,但没有找到任何信息。 - KiddoDeveloper
1
默认情况下,对任何https url运行curl将尝试建立一个http2连接。据我所知,“... offering h2”是客户端愿意使用http2而不是服务器的指示。运行curl -vso /dev/null --http2 https://site.i.know.does.not.support.http2总是返回“offering h2”。我发现运行curl -sI https://site.i.want.to.test -o /dev/null -w '%{http_version}\n'可以更可靠地指示http2支持。 - terryf82
@terryf82请查看使用curl进行HTTP/2HTTP/2中的TLS。我的答案是检查“网站是否支持HTTP/2协议”。你的命令是找出“实际使用的http版本”。 - Ahmad Ismail
ALPN,提供*是来自客户端(客户端在ALPN请求中添加了这些)。如果服务器不支持h2,则会看到相同的输出。之后打印服务器的响应。例如:服务器不支持h2。
  • ALPN,提供h2
  • ALPN,提供http/1.1 ...
  • ALPN,服务器未同意协议
支持h2的服务器:
  • ALPN,提供h2
  • ALPN,提供http/1.1 ... ALPN,服务器同意使用h2
- Najmuddin

40

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

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

这样做的优点在于,您只需连接到网站,如果您的浏览器支持它,它将自动协商HTTP/2,如果不支持,则会自动回退到HTTP/1.1。

因此,要测试HTTP/2支持,请像Markus建议的那样使用浏览器(例如,请确保在Chrome的Network选项卡中添加Protocol列)。

或者可以使用在线测试工具,例如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实例来支持这两个版本。 - Bagira
2
它并不是从HTTP/2开始然后切换回来。实际上,浏览器打开HTTPS连接并说:“我支持这个版本的TLS、这些密码和HTTP/2——让我知道哪个适合你”,然后服务器决定使用它们都理解的最佳设置。如果浏览器和服务器都支持HTTP/2,那么它将使用HTTP/2。如果浏览器没有表示支持,但服务器支持,则将使用HTTP/1.1。如果浏览器表示支持,而服务器则像“你所说的HTTP/2是什么?”那么它将忽略它并使用HTTP/1.1。 - Barry Pollard
是的,服务器应该支持两种实例并使用适当的协议。我们距离HTTP/2独有的世界还有很长的一段路要走,并且在很长一段时间内仍将处理某些连接的HTTP/1.1协议。 - Barry Pollard
谢谢,我理解了您所提到的要点。我的问题仍然是一样的,我们能否使用单个服务器同时支持HTTP/2和HTTP/1.1呢?对于Tomcat来说,建议在server.xml中进行更改以使用HTTP/2。如果这样做了,那么该Tomcat实例能够处理HTTP/1.1流量吗?因为我听说HTTP/2不向后兼容。 - Bagira
2
我自己不使用Tomcat,从快速搜索Google的文档来看并不十分清楚,但是如果添加HTTP/2支持会禁用HTTP/1.1支持,我会非常惊讶。 - Barry Pollard

32

使用F12组合键在Chrome中打开开发者工具,然后转到网络选项卡。

右键单击一个行,在菜单中选择标头选项,然后选择协议

输入图像描述


"h3" 是什么协议? - oᴉɹǝɥɔ
2
@oᴉɹǝɥɔ HTTP/3 - Nuno André

16

虽然这个问题已经被回答过了,但我还是要回答一下。

打开 Chrome 的 开发者工具。有很多种方法可以打开开发者工具,例如:

  • 我在 Mac 上,所以我使用 ⌥⌘i (⌥+⌘+i) 组合键来打开 Chrome 浏览器中的开发者工具。如果你使用键盘组合键,它会默认选择 Network 标签页。
  • 你也可以使用键盘上的 F12 键来做同样的事情。
  • 你也可以通过点击浏览器右上角的三个点(也称为省略号)来打开开发者工具。点击 三个点(省略号) -> 更多工具 -> 开发者工具

Name 列中右键单击,并确保选中了 Protocol 。现在你可以看到 Protocol 列了,其中 h2 表示 HTTP/2 h3 表示 HTTP/3 (如果你看到了它们),而 http/1.1 则表示 HTTP/1.1

enter image description here

enter image description here

你也可以通过以下方式查看 Protocol 列:

  • 在“名称”列下看到的行上右键单击, 然后点击表头选项, 勾选协议enter image description here enter image description here

  • 你可以在这里免费检查。以下是一个示例: 在输入框中输入带有HTTPS协议的网址,如:https://google.com 或者你自己的网站。

  • 还有一款chrome浏览器扩展程序可以帮助你。参考链接在这里

  • 你也可以使用curl命令进行检查。此线程有被接受的回答。

  • 如果你喜欢CLI,也可以使用以下命令:

    curl -sI --http2 https://stackoverflow.com/ | grep -i "HTTP/2"


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

标签。


1
我找了3分钟没找到,你能分享一下截图吗? - Sami

6

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

使用curl访问支持HTTP/2的Google - 自动选择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开关向我的服务器发起Curl请求,但响应仍然显示HTTP/1.1。
curl -Iks --http2 https://myserver/reset
HTTP/1.1 502 Bad Gateway
connection: close
content-length: 0

使用 --http2-prior-knowledge 参数向我的服务器进行 Curl 请求。请注意,不会收到任何响应。
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开关是为了处理不安全的情况 - 我的服务器使用自签名证书,否则不需要。
  • I开关用于发送HEAD请求并避免输出杂音。
  • 上述内容由Ubuntu 18.04上的curl 7.58.0捕获。

好的答案,附有解释,也是我唯一能够让事情正常工作并看到结果的答案。 - Raymond

5

你可以使用命令

curl -vso /dev/null https://google.com 2>&1 | grep ALPN

输出结果将是以下之一
 * ALPN, offering h2 // Client is offering HTTP 2 protocol
 * ALPN, offering http/1.1 // Client is also offering HTTP 1.1 protocol
 * ALPN, server accepted to use h2 // Server said that it is going to use HTTP 2 protocol

或者

* ALPN, offering h2 // Client is offering HTTP 2 protocol
* ALPN, offering http/1.1 // Client is also offering HTTP 1.1 protocol
* ALPN, server accepted to use http/1.1 // Server said that it's going to use HTTP 1.1 protocol, even though client supports HTTP 2.0

你可以看到解释就在 // 后的引用输出中。


4
你还可以使用一个很酷的Chrome/Firefox扩展程序,叫做HTTP/2和SPDY指示器来检查网站协议。

-1
curl -I --http2 -s https://domain.url/ | grep HTTP

2
如果您提供为什么这是首选解决方案以及解释其工作原理的说明,那将更有帮助。我们想要教育,而不仅仅提供代码。 - the Tin Man
在一些网站上,这会输出 HTTP/2 200,而在另一些网站上则是 HTTP/1.1 200 OK。您的意思是建议解析此命令的输出吗? - joanis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接