为什么 HTTP/2 客户端拒绝包含连接 header 的请求?
Why do HTTP/2 clients reject requests containing the connection header?
偷看 'Working with HTTP/2 in Burp Suite' 以找出为什么存在剥离连接 header 的选项,我发现原因是 'This is because many HTTP/2 servers will reject requests containing this header.'。
是否有具体原因?
是的,HTTP/2 规范在 section 8.1.2.2 中指出:
HTTP/2 does not use the Connection header field to indicate
connection-specific header fields; in this protocol, connection-
specific metadata is conveyed by other means. An endpoint MUST NOT
generate an HTTP/2 message containing connection-specific header
fields; any message containing connection-specific header fields MUST
be treated as malformed
话虽如此,许多服务器都比较宽容,可以容忍 Connection
header 存在,尽管它们会被忽略。
此限制的原因是 Connection
header 在 HTTP/1.1 请求中有意义,其中一次通过 TCP 连接发送一个请求。
在像 HTTP/2 这样的多路复用协议中,一个请求(一个 HTTP/2 流)携带连接 header 是没有意义的,因为可能有多个请求相同的 TCP 连接。
作为一个极端的例子,如果你有一个 HTTP/2 流 Connection: close
和另一个并发的 HTTP/2 流 Connection: keep-alive
(尽管 keep-alive
即使在 HTTP/1.1 中也被弃用了),HTTP/2 实现应该做什么?按照第一个流的建议关闭连接,还是按照第二个流的建议保持打开状态?
显然这不适用于 HTTP/2 等多路复用协议,这就是实现拒绝此类请求的原因。
偷看 'Working with HTTP/2 in Burp Suite' 以找出为什么存在剥离连接 header 的选项,我发现原因是 'This is because many HTTP/2 servers will reject requests containing this header.'。
是否有具体原因?
是的,HTTP/2 规范在 section 8.1.2.2 中指出:
HTTP/2 does not use the Connection header field to indicate connection-specific header fields; in this protocol, connection- specific metadata is conveyed by other means. An endpoint MUST NOT generate an HTTP/2 message containing connection-specific header fields; any message containing connection-specific header fields MUST be treated as malformed
话虽如此,许多服务器都比较宽容,可以容忍 Connection
header 存在,尽管它们会被忽略。
此限制的原因是 Connection
header 在 HTTP/1.1 请求中有意义,其中一次通过 TCP 连接发送一个请求。
在像 HTTP/2 这样的多路复用协议中,一个请求(一个 HTTP/2 流)携带连接 header 是没有意义的,因为可能有多个请求相同的 TCP 连接。
作为一个极端的例子,如果你有一个 HTTP/2 流 Connection: close
和另一个并发的 HTTP/2 流 Connection: keep-alive
(尽管 keep-alive
即使在 HTTP/1.1 中也被弃用了),HTTP/2 实现应该做什么?按照第一个流的建议关闭连接,还是按照第二个流的建议保持打开状态?
显然这不适用于 HTTP/2 等多路复用协议,这就是实现拒绝此类请求的原因。