使用socks5代理时,使用socks5代理的cURL请求失败,但它可以通过命令行运行

时间:2013-02-18 19:42:56

标签: php curl proxy socks ssh-tunnel

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隧道。隧道是开放的并且正常运行,正如命令行请求成功所证明的那样。

这里有没有明显遗漏的东西?

2 个答案:

答案 0 :(得分:8)

看起来在PHP中没有定义CURLPROXY_SOCKS5_HOSTNAME,但您可以明确地使用其等于7的值。

试试这个:

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);

答案 1 :(得分:0)

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

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

该常量自 PHP 5.5.23 和 PHP 5.6.7 以及 cURL 7.18.0 起可用,因此您可以简单地使用它。