【发布时间】:2016-07-06 16:30:23
【问题描述】:
我正在尝试在我的本地计算机上使用转发代理服务器(Apache Traffic Server 或 Squid),作为我的 cURL 调用的本地 HTTP 缓存。
我已经使用以下方式设置了代理:
curl_setopt($ch, CURLOPT_PROXY, 'http://localhost:8080');
当我查询一个HTTP网站时,cURL执行一个标准的HTTPGET代理请求,可以正常缓存:
GET http://example.com/ HTTP/1.1
但是,在查询 HTTPS 网站时,cURL 会改为执行 CONNECT,有效地将代理用作 TCP 隧道,并阻止它缓存响应:
CONNECT example.com:80 HTTP/1.1
有没有办法强制 cURL 执行 GET 请求,即使对于 HTTPS 网站也是如此?
我可以理解使用 TCP 隧道通过 HTTP 代理通过 HTTP 请求进行 HTTP 请求以实现安全性的基本原理,但由于我的代理服务器位于 localhost 上,因此我不在乎使用不安全的 HTTP 连接到代理,并希望使用 cURL执行GET 请求:
GET https://example.com/ HTTP/1.1
我尝试使用:
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false);
但这并没有改变任何东西。
【问题讨论】:
-
没有好办法 AFAIK;您需要一个伪造的 SSL 证书和一个智能拦截(SOCKS?)代理 - 用它自己的替换目标网站的 ssl - 一个例子是 telerik.com/fiddler 上的 Fiddler 代理
-
您可以尝试通过命令行使用 curl 吗?如果您使用的是 SOCKS 代理:
curl --socks5 127.0.0.1:8889 https://www.example.com/ -v如果您使用的是 HTTP 代理:curl -x http://PROXY_HOST:PROXY_PORT https://www.example.com/ -v -
您是否检查了
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);选项? ;) -
@MooYeolPrescottLee 将
CURLOPT_SSL_VERIFYPEER设置为false只是阻止cURL 验证SSL 证书的有效性,这是无关的。
标签: php curl http-proxy