我使用云服务器Ubuntu 12.04作为代理服务器进行报废。我现在面临的问题是显示错误
HTTP / 1.0 501 Tor不是HTTP代理内容类型:text / html;字符集= ISO-8859-1
$url = 'http://whatismyipaddress.com';
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init('http://whatismyipaddress.com');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, 'https://127.0.01:9050/');
curl_exec($ch);
curl_close($ch);
$result=curl_exec($ch);
需要帮助我缺少的东西。 我已经尝试使用
了curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
请求正在加载,会话过期但没有结果。
答案 0 :(得分:8)
确实如此,Tor不是HTTP代理,而是SOCKS v5代理。
根据您的cURL选项CURLOPT_HTTPPROXYTUNNEL
,您告诉cURL尝试错误地使用Tor的代理(作为HTTP代理)。
正确的方法是摆脱代理隧道选项,只需设置代理和SOCKS代理类型:
$proxy = '127.0.0.1:9050'; // no https:// or http://; just host:port
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
如果您没有PHP 5.5.23或更高版本(引入CURLPROXY_SOCKS5_HOSTNAME
),您可以使用curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
如果编译的cURL版本PHP小于7.18.0,则它不支持带有主机名查找的SOCSK5,因此您必须回退到CURLPROXY_SOCKS5
并且知道您的DNS查找将不超越Tor并可能被曝光。
附注:我写了一个名为TorUtils的PHP库,它提供了许多用于在PHP中与Tor交互的类。一个类是TorCurlWrapper
,它提取上面的逻辑并强制cURL正确使用Tor的SOCKS代理。有一个用法示例here。您可以使用composer require dapphp/torutils
安装库,也可以下载软件包并将其添加到代码中。