HTTP 标头中的 Connection 和 Proxy-connection 有啥区别?

Posted

技术标签:

【中文标题】HTTP 标头中的 Connection 和 Proxy-connection 有啥区别?【英文标题】:What is the difference between Connection and Proxy-connection in HTTP header?HTTP 标头中的 Connection 和 Proxy-connection 有什么区别? 【发布时间】:2013-03-05 20:16:25 【问题描述】:

HTTP头中ConnectionProxy-Connection有什么区别?

Proxy-Connection 字段是代理添加的吗?还是客户端和服务器?代理、客户端或服务器在接收到这两个字段分别为keep-alive和close的header后会做什么?

【问题讨论】:

“智能”HTTP 代理会将 Proxy-Connection 标头转换为等效的 Connection 标头(“证明”代理了解 Connection 标头是逐跳标头)。 “愚蠢”的 HTTP/1.0 代理会盲目地将标头转发给预期会忽略它的客户端或服务器。 【参考方案1】:

Connection 标头是 HTTP 1.0 和 1.1 规范(RFC 2068 和 RFC 2616)中定义的标准标头,用于在 HTTP 连接上保持保持活动状态。

Proxy-Connection 是 Netscape 开发人员创建的一个实验性标头,用于执行类似的操作,因为对何时可以使用 Connection 标头存在误解。它从未正常工作,并且被当今存在的许多常见 HTTP 系统所忽略。当它按设计工作时,两者之间没有区别。

【讨论】:

“由于对何时可以使用 Connection 标头存在误解。”不,这是一个明确的设计,旨在欺骗“旧版”HTTP/1.0 代理不要盲目地将逐跳 Connection 标头转发到 HTTP/1.1 客户端或服务器。【参考方案2】:

引自https://www.rfc-editor.org/rfc/rfc7230#appendix-A.1.2

在 HTTP/1.0 中,每个连接都是由客户端在之前建立的 请求并在发送响应后由服务器关闭。 然而,一些实现实现了明确协商的 (“Keep-Alive”)版本中描述的持久连接 [RFC2068] 的 19.7.1。

一些客户端和服务器可能希望与这些兼容 以前的持久连接方法,通过显式 使用“Connection: keep-alive”请求标头为他们协商 场地。然而,HTTP/1.0 的一些实验性实现 持久连接有故障;例如,如果 HTTP/1.0 代理 服务器不理解连接,它会错误地转发 该标头字段到下一个入站服务器,这将导致 挂起的连接。

一个尝试的解决方案是引入代理连接 标头字段,专门针对代理。在实践中,这 也是不可行的,因为代理通常部署在多个 层,带来了与上面讨论的相同的问题。

因此,鼓励客户端不要发送代理连接 任何请求中的标头字段。

还鼓励客户考虑使用 Connection: 小心地在请求中保持活动;虽然他们可以启用持久性 与 HTTP/1.0 服务器的连接,使用它们的客户端需要 监视“挂起”请求的连接(这表明 客户端应该停止发送头域),并且这个机制应该 使用代理时根本不被客户端使用。

【讨论】:

我想知道为什么 vanilla http_proxy=myproxy.io:8080 curl -v ... 实际上会 send > Proxy-Connection: Keep-Alive 不鼓励客户使用。

以上是关于HTTP 标头中的 Connection 和 Proxy-connection 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

将标头添加到(HTTP 请求)文件下载

如果HTTP / 1.0客户端请求Connection:keep-alive,它会理解分块编码吗?

HTTP 连接标头

节点js [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头

在哪里可以找到所有可能的“连接”标头值?

HTTP协议header标头的通用头域