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隧道。隧道是开放的并且正常运行,正如命令行请求成功所证明的那样。
这里有没有明显遗漏的东西?
答案 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 起可用,因此您可以简单地使用它。