查看"在Burp Suite中使用HTTP/2"以了解为什么存在剥离连接标头的选项,我发现原因是"这是因为许多HTTP/2服务器会拒绝包含此标头的请求。"。
这有具体的原因吗?
是的,HTTP/2规范在第8.1.2.2节中指出:
HTTP/2不使用连接头字段来指示特定于连接的标头字段;在该协议中,连接-通过其他方式来传送特定元数据。端点不得生成包含连接特定标头的HTTP/2消息田地;任何包含特定连接头字段的消息都必须被视为格式错误的
话虽如此,许多服务器更宽容,允许出现Connection
标头,尽管它们被忽略了。
这种限制的原因是Connection
标头在HTTP/1.1请求中是有意义的,其中一次通过TCP连接发送一个请求。
在像HTTP/2这样的多路复用协议中,请求(HTTP/2流(携带连接头是没有意义的,因为在同一个TCP连接上可能有多个请求。
举一个极端的例子,如果您有一个Connection: close
的HTTP/2流和另一个Connection: keep-alive
的并发HTTP/2流(尽管即使在HTTP/1.1中也不推荐使用keep-alive
(,那么HTTP/2实现应该做什么?按照第一个流建议关闭连接,还是按照第二个流建议保持连接打开?
显然,这不适用于像HTTP/2这样的多路复用协议,这就是实现拒绝此类请求的原因。