禁用跨域的 HTTP/2 连接重用

禁用跨域的 HTTP/2 连接重用

RFC 7540,§9.1.1指出

连接 [...] 可以重复用于具有多个不同 URI 权威组件的请求 [...] 只要原始服务器具有权威性 [...]。

因此,例如,如果同一源服务器可以为 foo.example.com 和 bar.example.com 提供服务,则客户端可以重用连接向两个目的地发出请求。如果不希望这样做,同一节会说

不希望客户端重用连接的服务器可以通过发送 421(错误重定向的请求)状态代码来响应请求,以表明它对请求没有权威性[...]。

这可能出现在一些意想不到的情况下,例如使用了虚拟服务器,并且其 TLS 配置不同但他们使用通配符或主题备用名称共享证书。

不幸的是,最终结果是一次或多次额外的往返:客户端乐观地重用连接,服务器拒绝请求,然后客户端必须打开新连接并重试。在最坏的情况下,这可能与仅使用不重用的 HTTP/1.1 连接一样糟糕,甚至可能更糟糕。当同一源服务器共享许多不同的目的地并由同一客户端寻求时,情况似乎变得特别糟糕,因为每次响应 421 时打开新连接时,客户端仍然认为它可以重用连接,因此 421 出现的频率几乎与有用的响应一样高。

假设底层问题难以解决,或者至少发送 421 响应的条件超出了服务器管理员的控制范围,但事实是已知的,有没有办法提前通知客户端不要跨域重用连接?这仍然保留了 HTTP/2 连接重用的主要好处,即对相同的域可以在单个连接上多路复用,同时还可以避免可预见的 421 响应。

答案1

最核心的方案是将需要特殊配置的服务器放在单独的 IP 地址上,这样浏览器就无法重复使用连接。如果网站需要通过互联网访问,那么它必须是单独的全球的IP 地址,而不是本地网络中单独的 RFC1918 地址。

答案2

您似乎认为 421 错误不在服务器管理员的控制范围内。事实并非如此。这种情况完全是由于服务器管理员的配置选择而发生的。

如果您不希望发生这种情况,请对不希望共享 HTTP/2 连接的名称使用不同的 TLS 证书和不同的 TLS 配置。由于该连接只能重复用于该 TLS 证书上的名称,因此不匹配意味着客户端必须打开新的连接。

相关内容