在 cURL 文档中,有一个名为 CURLOPT_HTTPPROXYTUNNEL
的选项它被定义为在启用时通过代理创建隧道。
但是,我不知道隧道是什么以及它有什么作用。如果我不使用这样的隧道会有什么不同?
curl_setopt($session, CURLOPT_HTTPPROXYTUNNEL, 1)
更新:
我得到的是隧道引用了一个HTTP CONNECT METHOD
,这是我所理解的:
基于 HTTP 的隧道方法使用 HTTP CONNECT 方法/命令。客户端向 HTTP 代理发出 HTTP CONNECT 命令。然后,代理与特定服务器:端口建立 TCP 连接,并在该服务器:端口和客户端连接之间中继数据。由于这会产生安全漏洞,因此支持 CONNECT 的 HTTP 代理通常会限制对 CONNECT 方法的访问。代理仅允许访问特定授权服务器的白名单。
那么,问题是,使用和不使用 CONNECT 方法连接到代理有什么区别?
最佳答案
没有CURLOPT_HTTPPROXYTUNNEL
没有CURLOPT_HTTPPROXYTUNNEL
:您只需使用代理地址/端口作为 HTTP 请求的目标。代理将读取您查询的 HTTP header ,将您的请求转发到目的地(带有您的 HTTP header ),然后将响应写入给您。
示例步骤:
HTTP GET/index.html
发送到1.1.1.1(代理)
1.1.1.1
接收请求并解析 header 以获取 HTTP 请求的最终目的地。1.1.1.1
将您的查询和 header 转发到www.site.com(请求 header 中的目的地)
。1.1.1.1
将从www.site.com
收到的回复写回给您
使用CURLOPT_HTTPPROXYTUNNEL
使用 CURLOPT_HTTPPROXYTUNNEL
:您要求代理通过执行 CONNECT 打开直接到目的地的直接二进制连接(如 HTTPS,称为
HTTP 请求。当隧道正常时,代理会向您回写 TCP 隧道
) HTTP/1.1 200 Connectionbuilt
。当它收到你的浏览器开始直接查询目的地:代理不解析HTTP header ,理论上不读取隧道数据,它只是转发它,这就是为什么它被称为隧道!
示例步骤:
HTTP CONNECT
发送到1.1.1.1
1.1.1.1
接收HTTP CONNECT
并获取最终目的地的 IP/端口(HTTP CONNECT< 的
)。header
字段)/1.1.1.1
通过与目标2.22.63.73:80 (ip/www.site.com 端口)
。1.1.1.1
通过将TCP Socket
通过管道连接到打开2.22.63.73:80< 的
然后写回TCP Socket
来创建隧道HTTP/1.1 200 Connectionbuilt
这意味着您的客户端现在可以让您的查询抛出TCP 隧道
(收到的 TCP 数据将直接传输到服务器,反之亦然)。
关于curl - curl 选项 CURLOPT_HTTPPROXYTUNNEL 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288956/