使用 Chrome 或 Safari 强制 HTTP/2
Posted
技术标签:
【中文标题】使用 Chrome 或 Safari 强制 HTTP/2【英文标题】:Force HTTP/2 With Chrome or Safari 【发布时间】:2015-06-06 14:59:26 【问题描述】:有没有办法告诉 Chrome 或 Safari 在特定的 URL/地址/服务器上使用 HTTP/2?
我的意思是通过更改某些设置等,而不是通过在服务器套接字上实现 ALPN 或任何可能需要的东西。我想在服务器套接字上尝试 HTTP/2,而不是等到我可以进行 ALPN 协商来告诉浏览器使用 HTTP/2。
澄清:我在 Chrome 上启用了 HTTP/2(又名 SPDY/4,通过 chrome://flags)。它仍然没有通过升级探测我的(TLS 或明文)套接字的 HTTP/2。我想强制 Chrome 要么这样做,要么立即假设 HTTP/2。
另外,我听说 Chrome 不支持通过纯文本连接的 HTTP/2,即使 HTTP/2 标准允许它。但也许有一些方法可以解决这个问题。
【问题讨论】:
【参考方案1】:HTTP/2 over TLS 和 HTTP/2 over TCP 被定义为两种不同的协议,分别由 h2 和 h2c 标识。
Chrome 目前仅支持 h2。
如果您的服务器仅实现 h2c,连接 Chrome 的最简单方法是在您的服务器前面以 HTTP/2 桥接模式使用反向代理,例如 nghttpx
【讨论】:
感谢您的回答。但是:我想在服务器套接字上尝试 HTTP/2,而不是等到我可以进行 ALPN 协商来告诉浏览器使用 HTTP/2。 您不必“等待” ALPN,而且您只需进行常规 TLS 握手即可:服务器不仅选择了 TLS 协议版本,还选择了 TLS 协议和应用程序协议(例如,浏览器宣布支持 TLS 1.1、TLS 1.2、HTTP/1.1、SDPY/3.1、H2,服务器为会话选择 TLS 1.2 和 H2。明文套接字上的 HTTP/2 称为 h2c 和不受 chrome 支持。 我所说的“等待”的意思是:我使用的“平台”,Java,目前没有 TLS 套接字 ALPN,但最终,它会(无法想象它没有得到它一点)。通过说服浏览器直接使用 HTTP/2,我不需要 ALPN。参照***.com/questions/29399182/java-http-2-server-socket ALPN 使用 Jetty ALPN 库与 Java 一起工作得很好。如果您不能或不想使用此库,最简单的方法是使用 nghttpx (nghttp2.org/documentation/nghttpx-howto.html) 作为服务器前的反向代理。您可以使用 HTTP/2 桥接模式让 nghttpx 通过 TLS 与浏览器协商 HTTP/2,并在后端使用直接 h2c 到您的 java 服务器。 感谢这两个想法。代理的想法是这个问题的一个很好的答案,因为它一直是 HTTP2,避免了我需要避免的 HTTP1 的头部问题,所以如果你把它放在你的答案文本中,我会检查它。我认为 Jetty ALPN 是我 Java 问题的一个很好的答案。【参考方案2】:据我所知,这很可能是浏览器范围的设置。
在chrome中你可以启用SPDY4,见chrome://flags
从版本 8 开始就添加了对 safari 的支持。
最后,一切都是为了知道您是否与服务器说相同的语言。如果您使用的是 http,则可以使用 Upgrade 标头进行检查。有一些插件可以与 chrome 一起使用,以指示您访问的地址是否支持 http/2。
有关 http/2 协议本身的更多信息,您应该查看https://http2.github.io/http2-spec/#starting
【讨论】:
以上是关于使用 Chrome 或 Safari 强制 HTTP/2的主要内容,如果未能解决你的问题,请参考以下文章
在 WKWebView 中加载 safari 或 chrome 中的链接/URL
使用 Google Chrome 或 Safari 在 Mac 上集成 Windows Auth (NTLM)
强制 Safari 在 jQuery GET 请求中包含 Origin 标头
Tablesorter Pager 在 Safari 或 Chrome 中不起作用