7

cURL + 代理菜鸟在这里,很难。我在尝试通过代理从远程安全服务器检索网页时遇到问题。远程开发人员显然已经正确设置了一切,因此以下命令行指令可以正常工作并返回我们正在寻找的内容:

curl -k --socks5-hostname localhost:xxxx https://hostname/

但是,以下 PHP 不会回显请求的网页。相反,它会回显错误“无法解析主机名”:

$proxy = 'localhost:xxxx';
$url = 'https://hostname/';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_URL, $url);
$curl_scraped_page = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

if ($error)
    echo $error;
elseif ($curl_scraped_page)
    echo $curl_scraped_page;

如果把$url改成公共页面,比如google,请求成功,大家开心。

如果有任何改变,则连接需要 SSH 隧道。隧道已打开且正常运行,命令行请求成功证明了这一点。

这里有什么明显的遗漏吗?

4

2 回答 2

11

您需要将选项设置CURLOPT_PROXYTYPECURLPROXY_SOCKS5_HOSTNAME,遗憾的是在旧 PHP 版本中没有定义,大约在 5.6 之前;如果您之前有,但您可以显式使用它的值,它等于7

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
于 2013-08-17T22:36:25.553 回答
0

在选项中CURLOPT_PROXYTYPE,您需要设置CURLPROXY_SOCKS5_HOSTNAMEoption 而不是CURLPROXY_SOCKS5. 在这种情况下,DNS 查询(用于主机名解析)将被发送到 SOCKS 代理,而不是在本地网络中解析。

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

这个常量从 PHP 5.5.23 和 PHP 5.6.7 和 cURL 7.18.0 开始可用,所以你可以简单地使用它。

于 2021-03-11T14:02:45.233 回答