HTTP头中的Connection和Proxy-connection有什么区别?

20

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

Proxy-Connection字段是由代理服务器添加的吗?还是客户端和服务器?如果接收到这两个字段值为keep-alive和close的报文头,那么代理服务器、客户端或服务器会怎样处理?


一个“智能”的HTTP代理会将Proxy-Connection头转换为等效的Connection头(“证明”代理理解Connection头是逐跳头)。一个“愚蠢”的HTTP/1.0代理将盲目地将头部转发给预计会忽略它的客户端或服务器。 - EricLaw
2个回答

22

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

Proxy-Connection是由Netscape开发人员创建的实验性头,旨在通过错误地理解Connection头可以使用的时间来执行类似的操作。它从未正常工作,并被许多现有的常见HTTP系统忽略。当按设计方式工作时,两者之间没有区别。


8
“由于对 Connection 头字段的使用时机存在误解。”不是这样的。这是一种明确的设计,旨在欺骗“遗留”的 HTTP/1.0 代理程序,使其不会盲目地将逐跳(hop-by-hop)的 Connection 头字段转发给 HTTP/1.1 的客户端或服务器。 - EricLaw

4

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

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

一些客户端和服务器可能希望与这些先前的持久连接方法兼容,通过使用“Connection:keep-alive”请求头字段来明确协商它们。但是,一些HTTP/1.0持久连接的实验性实现存在缺陷;例如,如果一个HTTP/1.0代理服务器不理解Connection,则会错误地转发该头字段到下一个入站服务器,这将导致连接挂起。

一种尝试的解决方案是引入一个专门针对代理的Proxy-Connection头字段。实际上,这也是行不通的,因为代理通常部署在多层中,带来了上述相同的问题。

作为结果,鼓励客户在任何请求中不发送Proxy-Connection头字段。
同时,客户也应谨慎考虑在请求中使用Connection: keep-alive;虽然它们可以启用与HTTP/1.0服务器的持久连接,但使用它们的客户端将需要监视“挂起”的请求(这表明客户端应停止发送头字段),并且当使用代理时,客户端根本不应使用此机制。

1
我想知道为什么使用基本的 http_proxy=myproxy.io:8080 curl -v ... 命令会实际上发送 > Proxy-Connection: Keep-Alive,尽管这在客户端中是不被鼓励的。 - miku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接