Tor不是HTTP代理

时间:2016-08-15 06:34:36

标签: curl ubuntu-12.04 tor

我使用云服务器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);

请求正在加载,会话过期但没有结果。

1 个答案:

答案 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安装库,也可以下载软件包并将其添加到代码中。