为什么curl会发送Proxy-Connection头,即使RFC似乎不鼓励这样做?

9

RFC 7230, 超文本传输协议(HTTP / 1.1):消息语法和路由在附录中说明:

因此,鼓励客户端不要在任何请求中发送Proxy-Connection头字段

那么为什么curl在使用代理时会发送此标头呢?

$ http_proxy=0.0.0.0:8080 curl -v http://google.com
...
> Accept: */*
> Referer:
> Proxy-Connection: Keep-Alive
>
...

我正在 x86_64-pc-linux-gnu 上使用 curl 7.71.1


附加说明:这是另一个协议,但HTTP/2明确禁止Connection和相关字段,根据RFC 7540 Section 8.1.2.2
2个回答

29

这是一个非常棒的问题!感谢您的提问。

这个问题很好地展示了网络上的一些情况:实际情况与规范和我们应该做的并不完全匹配。

实际上,在2016年,我们(在curl项目中)从curl请求中删除了“Proxy-Connection: Keep-Alive”头,原因正是它并不必要——因为协议本身就暗示了keep-alive,并且规范也是这样说的!

然后,在那次更改之后,我们立即收到了一连串的错误报告,来自于那些使用遗留代理的人们,他们的代理连接彻底崩溃了,持久连接也无法工作……一旦我们撤销了那个更改,一切都恢复正常了。

所以,也许到了2026年左右,事情已经发生了足够的变化,使我们可以再次进行这项实验。在那之前,我们会保留这个头部,在代理请求中使用它,以防止所有那些糟糕的遗留代理出现异常情况!

万维网是一个疯狂的世界。


2
迟到总比不来得好:非常感谢您的见解,并花时间与我们分享。 - miku

1

作为解决方法的一个小提示,我发现我的代理正在转发Proxy-Connection头部,由于某些原因,当Web服务器看到这个头部时会返回403错误。我成功地使用以下方法删除了该头部:

curl -v -x proxyserver --proxy-header "Proxy-Connection:" http://example.com

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