【问题标题】:PHP connect to HTTPS site through proxyPHP通过代理连接到HTTPS站点
【发布时间】:2014-04-11 14:41:00
【问题描述】:

我遇到了以下问题:有一个 HTTPS 网站,我需要通过代理连接到它。这是我的 cURL setopts:

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, '100.100.100.100:8080');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

echo curl_error($ch);

输出连接到######.com:8080 失败;没有错误

其中 100.100.100.100:8080 是有效 HTTPS 代理的占位符。这行不通。如何使 cURL 通过代理连接到 HTTPS 网站?我真的很想要一个不仅可以通过 HTTPS 代理工作的灵魂。另外,我更喜欢使用 cURL 的方法,但如果有更好的方法,不使用 cURL,我可以改用它。

【问题讨论】:

  • 代理是否需要认证?
  • 你必须添加curl_error()的输出
  • @SquareCat:代理不需要身份验证。
  • @hindmost:它说连接到 ######.com:8080 失败;没有错误
  • '输出连接到 ######.com:8080 失败;没有错误';这是否意味着您的目标网址也包含“8080”? (我说的不是代理 URL,而是 $url 变量)

标签: php curl https proxy


【解决方案1】:

更新: 添加

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);

它将阻止您的 HTTP 代理解析您的请求标头并以更透明的方式进行操作 - 就像隧道一样。


初步回答,不感兴趣

您的代码看起来不错,我假设您检查了琐碎的问题,因此问题可能是 SSL 证书验证失败。如果证书是通过示例自签名的,就是这种情况。 试试看

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

允许允许使用自签名证书的请求。

【讨论】:

  • 用这一行替换我原始代码中的 CURLOPT_SSL_VERIFYPEER 时,它会崩溃并出现以下错误:致命错误:不在对象上下文中使用 $this
  • @Pascal Le Merrer 同curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
  • 忘记我的回答,你的参数已经有我建议的值了。对不起。
  • 关于您的更新:错误已更改,现在如下:error:140770FC:SSLroutines:SSL23_GET_SERVER_HELLO:unknown protocol
  • 这是向 https 服务器发出 http 请求时的那种响应...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多