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って書いてあるしな・・。