7

ここでcURL+プロキシnoob、苦労しています。プロキシ経由でリモートの安全なサーバーからWebページを取得しようとして問題が発生しました。次のコマンドライン命令が機能し、探しているものを返すように、すべてがリモート開発者によって正しく設定されているようです。

curl -k --socks5-hostname localhost:xxxx https://hostname/

ただし、次のPHPは、要求されたWebページをエコーし​​ません。代わりに、「ホスト名を解決できませんでした」というエラーがエコーされます。

$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トンネルが必要な場合は、SSHトンネルが必要です。コマンドラインリクエストが成功したことで証明されるように、トンネルは開いていて機能しています。

ここで見逃されている明らかなものはありますか?

4

2 に答える 2

11

CURLOPT_PROXYTYPEオプションをに設定する必要がありますCURLPROXY_SOCKS5_HOSTNAME。これは、残念ながら、5.6より前の古いPHPバージョンでは定義されていませんでした。以前に持っていたが、その値を明示的に使用できる場合は、次のようになります7

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
于 2013-08-17T22:36:25.553 に答える
0

オプションでは、の代わりにオプションCURLOPT_PROXYTYPEを設定する必要があります。この場合、DNSクエリ(ホスト名解決用)はSOCKSプロキシに送信され、ローカルネットワークでは解決されません。CURLPROXY_SOCKS5_HOSTNAMECURLPROXY_SOCKS5

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

この定数は、PHP5.5.23およびPHP5.6.7およびcURL7.18.0以降で使用できるため、簡単に使用できます。

于 2021-03-11T14:02:45.233 に答える