プロキシ経由でCURLを使用する方法


128

プロキシサーバーを使用するようにcurlを設定しようとしています。URLはhtmlフォームによって提供されますが、これは問題になりませんでした。プロキシがなければ正常に動作します。このサイトや他のサイトでコードを見つけましたが、機能しません。正しい解決策を見つけるための助けがあれば大歓迎です。ベローズは近いと感じますが、何かが足りないようです。ありがとうございました。

ここからhttp://www.webmasterworld.com/forum88/10572.htmを適応させた次のコードですが、行12にT_VARIABLEがないというエラーメッセージが返されます。

<?

$url = '$_POST[1]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1)
curl_exec ($ch); 
$curl_info = curl_getinfo($ch);
curl_close($ch);
echo '<br />';
print_r($curl_info);
?>

以下はカールからプロキシを経由してコンテンツが返されない

<?

$proxy = "66.96.200.39:80";
$proxy = explode(':', $proxy);
$url = "$_POST[1]";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
?>

現在、pelican-cement.comでライブ配信されていますが、機能しません。

更新:たくさんのご協力ありがとうございます。上記の変更を行いました。現在は空白の画面のみが返されます。

<?

$url = $_POST['1'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_exec ($ch); 
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
?> 

3
12行目のセミコロンが欠落しています
Pekka

また、$ url = '$ _POST [1]'を$ url = $ _POST [1]に変更する必要があります-それ以外の場合、$ urlは
目的の

また、$ $_POST['1']
_ POST

2
pelican-cement.comのフォームには、「firstname」と「lastname」という名前の入力がありますが、「1」という名前の入力はありません。
John Flatness 2011年

2
@ user586011:以下の回答としてソリューションを追加し、受け入れてください。解決策を質問に入れないでください。それはうまくいきません。
hakre

回答:


221

これは、バグが削除された作業バージョンです。

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//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_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

CURLOPT_PROXYUSERPWDプロキシのいずれかにユーザー名とパスワードが必要な場合に備えて追加しました。1に設定CURLOPT_RETURNTRANSFERして、データが$curl_scraped_page変数に返されるようにします。

curl_exec($ch);変数が返されないようにする2つ目の追加を削除しました。プロキシIPとポートを1つの設定に統合しました。

私も削除CURLOPT_HTTPPROXYTUNNELCURLOPT_CUSTOMREQUEST、それがデフォルトだったので。

ヘッダーを返さない場合は、コメントアウトしてくださいCURLOPT_HEADER

プロキシを無効にするには、それをnullに設定するだけです。

curl_setopt($ch, CURLOPT_PROXY, null);

ご不明な点がございましたら、お気軽にお問い合わせくださいcURL


CURLを毎日使用していることを知ってうれしいです。socksプロキシを設定してみましたが、ローカルマシンでは機能しますが、Linux専用サーバーでは機能しません。何か案が ?
coding_idiot

@coding_idiotほとんどのWebホストは、セキュリティ上の理由から、80または443ではないポートをブロックします。
sousdev 2013

私はすでにそれを解決しました。他の人もこれから恩恵を受けると確信しています。
coding_idiot

@GravyCode:一部のサービスからプロキシを取得する場合、ユーザー名/パスワードを渡す必要がありますか?
Pragnesh Chauhan 14年

1
プロキシポートがウェブホストによってブロックされているかどうかをどのように知る必要がありますか?
user1788736

35

CURL PROXYに必要なさまざまなCURLオプションの使用について説明しました。

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);         // URL for CURL call
curl_setopt($ch, CURLOPT_PROXY, $proxy);     // PROXY details with port
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);   // Use if proxy have username and password
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // If expected to call with specific PROXY type
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // If url has redirects then go to the final redirected URL.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  // Do not outputting it out directly on screen.
curl_setopt($ch, CURLOPT_HEADER, 1);   // If you want Header information of response else make 0
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

3
これらのコメントは役に立ちますが、追加のオプションは実際には必要ないことに注意する必要があります。
ネイト

-1

これは、十分にテストされた機能であり、詳細な自己説明コメント付きでプロジェクトに使用しました


80以外のポートがサーバーのファイアウォールによってブロックされることがよくあるため、コードはサーバーではなくローカルホストで正常に機能しているように見えます

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}

1
これは私を助けました:curl_setopt($ ch、CURLOPT_SSL_VERIFYPEER、false); // httpsの場合はfalse
villamejia

1
@villamejiaただし、CURLOPT_SSL_VERIFYPEER = falseの使用には注意してください。これは、cURLがhttpsサーバーに接続するときに証明書チェックを行わないため、接続が中間者攻撃に対して脆弱になるため、データのセキュリティが保証されなくなることを意味します。CURLOPT_CAPATHを使用して、有効なルート証明機関のセットを含むディレクトリを提供する(/etc/ssl/certsDebian / Ubuntuなど)
Ale
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.