Tor不是HTTP代理。

7
我正在使用云服务器Ubuntu 12.04作为用于网页抓取的tor代理服务器。目前遇到的问题是显示错误信息:
HTTP/1.0 501 Tor不是HTTP代理服务器Content-Type: text/html; charset=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个回答

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);

如果 PHP 编译的 cURL 版本小于 7.18.0,则不支持SOCSK5与主机名查找,因此您必须回退到使用 CURLPROXY_SOCKS5 并知道您的 DNS 查找将不会经过 Tor 并可能会被暴露。

附注:我编写了一个名为 TorUtils 的 PHP 库,其中提供了许多与 Tor 在 PHP 中交互的类。其中一个类是 TorCurlWrapper,它抽象出了上述逻辑,并强制 cURL 正确使用 Tor 的 SOCKS 代理。这里有一个使用示例 您可以使用 composer require dapphp/torutils 安装该库,或者通过下载软件包并将其添加到您的代码中来安装它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接