例如,
我们可以决定使用
http://
或https://
,但如何编写HTTP/2请求?我知道这个协议取决于服务器能力,但我找不到一种方法来检查一个网站(例如
google.com
)是否启用了HTTP/2支持。
从这张图片中可以看出,所有现代浏览器都支持该协议。 我没有看到任何可能看起来像新一代协议的链接。
我们是在不知情的情况下使用HTTP/2协议吗?还是这只是一个童话故事?
http://
或https://
,但如何编写HTTP/2请求?google.com
)是否启用了HTTP/2支持。
从这张图片中可以看出,所有现代浏览器都支持该协议。 我没有看到任何可能看起来像新一代协议的链接。
我们是在不知情的情况下使用HTTP/2协议吗?还是这只是一个童话故事?
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
。
curl -vso /dev/null --http2 https://www.cloudflare.com/ 2>&1| grep "offering h2"
- Programmercurl -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支持。 - terryf82HTTP/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。
虽然这个问题已经被回答过了,但我还是要回答一下。
打开 Chrome 的 开发者工具
。有很多种方法可以打开开发者工具,例如:
Network
标签页。F12
键来做同样的事情。三个点(省略号) -> 更多工具 -> 开发者工具
。在 Name
列中右键单击,并确保选中了 Protocol
。现在你可以看到 Protocol
列了,其中 h2
表示 HTTP/2
,h3
表示 HTTP/3
(如果你看到了它们),而 http/1.1
则表示 HTTP/1.1
。
你也可以通过以下方式查看 Protocol
列:
你可以在这里免费检查。以下是一个示例: 在输入框中输入带有HTTPS协议的网址,如:https://google.com 或者你自己的网站。
还有一款chrome浏览器扩展程序可以帮助你。参考链接在这里。
你也可以使用curl
命令进行检查。此线程有被接受的回答。
如果你喜欢CLI,也可以使用以下命令:
curl -sI --http2 https://stackoverflow.com/ | grep -i "HTTP/2"
解决方案使用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
请求并避免输出杂音。你可以使用命令
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
你可以看到解释就在 // 后的引用输出中。
curl -I --http2 -s https://domain.url/ | grep HTTP
HTTP/2 200
,而在另一些网站上则是 HTTP/1.1 200 OK
。您的意思是建议解析此命令的输出吗? - joanis
http2://
没有任何意义,因为它仍然是相同的http
协议,只是另一个版本。使用一个http://
uri 可以实现回退,如果可能使用版本2,否则回退到v1。 - Mike Doehttp2://
不是更合理吗?如果不可用,则前置https://
。我的意思是按照这个理论,没有理由前置https://
,我只是好奇而已,不想表现得聪明。 - JΛYDΞV