phpのcurlが動かない。

PHPのcurlでどはまりした。普通に接続するには問題ないが、proxy環境から接続するのが問題。まず、proxyを通さずに普通に接続擦る場合のコードはこんな感じ。

$url="https://www.myexample.com";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$value = curl_exec($ch);
curl_close($ch);
echo $value;

これはまぁ、普通につながるんだよ。で、Proxy経由にすると、よく書いてあるのは、こんな感じ。

$url="https://www.myexample.com";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com");
curl_setopt($ch, CURLOPT_PROXYPORT, 10080);

$value = curl_exec($ch);
curl_close($ch);
echo $value;

みたいな?。
当初これでつながっていた。ところが、下記の様にurlを変えた途端うごかなくなった。

$url="http://www.yahoo.co.jp";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com");
curl_setopt($ch, CURLOPT_PROXYPORT, 10080);

$value = curl_exec($ch);
curl_close($ch);
echo $value;

何が違うのか?。しばらく悩んだ。myexample.comからyahooに変えただけなのに・・。
動かすには?。こうすれば良い。

$url="http://www.yahoo.co.jp";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com");
curl_setopt($ch, CURLOPT_PROXYPORT, 10080);

$value = curl_exec($ch);
curl_close($ch);
echo $value;

つまり、HTTPROXYTUNNELの解釈に間違いがあった。PROXYって書いてあるので、単純にPROXYを使う時はこれを1にするのかと思ってたのだが、それが間違い。なぜ今までつながっていたかというと、”https”だったから。httpsの場合CONNECTメソッドを使うしかないので、普通にTUNNELで良いのだが、”http”の場合、PROXYによってはCONNECTを認めてない。その場合HTTPPROXYTUNNELを1にすると動かなくなると。

ヘッダーを出力して、”CONNECT http://www.yahoo.co.jp”ってなっているのを見て気がついた。日本の会社のPROXYって外からの攻撃より、内部のデータの外部流出を防ぐためにある!。みたいなところがあるので、SOCKとかCONNECTとかPROFIND(だっけ?)とか動かないのよね・・・。

HTTPPROXYTUNNELを1にして動いている人は、本来のPROXY(代理人)の役割として機能しているproxyを使っている人かな。檻に閉じ込めるためのPROXYを通さなきゃ外に出られない人は、HTTPPROXYTUNNELは0にしておかなきゃいけないっぽい。まぁ、TUNNELって書いてあるしな・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)