在cURL文档中,有一个名为CURLOPT_HTTPPROXYTUNNEL
的选项,它被定义为在启用时通过代理创建隧道。
但是,我不知道隧道是什么以及它做了什么。如果我不使用像这样的隧道会有什么不同呢?
curl_setopt($session, CURLOPT_HTTPPROXYTUNNEL, 1)
更新
我得到的是隧道指的是HTTP CONNECT METHOD
,这就是我所理解的:
基于HTTP的隧道方法使用HTTP CONNECT方法/命令。客户端向HTTP代理发出HTTP CONNECT命令。然后,代理与特定服务器建立TCP连接:端口,并在该服务器:端口和客户端连接之间中继数据。因为这会产生安全漏洞,所以支持CONNECT的HTTP代理通常会限制对CONNECT方法的访问。代理仅允许访问特定授权服务器的白名单。
所以,问题是,使用和不使用CONNECT方法连接代理有什么区别?
答案 0 :(得分:19)
没有CURLOPT_HTTPPROXYTUNNEL
不使用CURLOPT_HTTPPROXYTUNNEL
:您只需使用代理地址/端口作为HTTP请求的目标。代理将读取查询的HTTP标头,将您的请求转发到目标(使用您的HTTP标头),然后将响应写入您。
示例步骤:
HTTP GET /index.html
已发送至1.1.1.1 (proxy)
1.1.1.1
接收请求并解析标头以获取HTTP请求的最终目的地。1.1.1.1
将您的查询和标题转发给www.site.com (destination in request headers)
。1.1.1.1
写回来自www.site.com
使用CURLOPT_HTTPPROXYTUNNEL
使用CURLOPT_HTTPPROXYTUNNEL
:您要求代理通过执行TCP Tunnel
HTTP请求直接打开到目的地的直接二进制连接(如HTTPS,称为CONNECT
)。当隧道没问题时,代理会给你写一个HTTP/1.1 200 Connection established
。当它收到你的浏览器开始直接查询目的地:代理不解析HTTP头,理论上不读取隧道数据,它只是转发它,这就是为什么它被称为隧道!
示例步骤:
HTTP CONNECT
已发送至1.1.1.1
1.1.1.1
收到HTTP CONNECT
并获取最终目的地的{/ 1}} header
字段的IP /端口。HTTP CONNECT
通过1.1.1.1
向目的地TCP Socket
开启TCP handshake
。 2.22.63.73:80 (ip/port of www.site.com)
通过将您的1.1.1.1
发送到TCP Socket
打开TCP Socket
,然后给你回信2.22.63.73:80
来建立隧道,这意味着您的客户现在可以使您的查询抛出HTTP/1.1 200 Connection established
(收到的TCP数据将直接传输到服务器,反之亦然)。