1

I'm trying to get the content of a stream over HTTPS, but I have to go over an HTTP proxy. I'd like not to use cURL but rather use fopen with a context argument.

The thing is, I can't make it work over HTTPS (HTTP is working fine though).

This DOES NOT work :

$stream = stream_context_create(Array("http" => Array("method"  => "GET",
                                                      "timeout" => 20,
                                                      "proxy"   => "tcp://my-proxy:3128",
                                                      'request_fulluri' => True 
                                )));
echo file_get_contents('https://my-stream', false, $context); 

This DOES work (cURL) :

$url = 'https://my-stream';
$proxy = 'my-proxy:3128';

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

Does somebody know what is wrong with the first piece of code ? if it works with cURL there has to be a way to make it work with a context. I tried to change the context options to a bunch of different values woth no luck.

Any help would be greatly appreciated !

Thanks.

4

1 に答える 1

7

正確なエラー メッセージを指定していません。追加してみてくださいignore_errors => true。しかし、400 Bad RequestApache から取得している場合、おそらく発生している問題は、サーバー名の表示とホスト ヘッダーの不一致です。これに関連する PHP バグもあります: https://bugs.php.net/bug.php?id=63519

このバグが解決されるまで、次の修正を試してください。

$stream = stream_context_create(array(
    'http' => array(
        'timeout' => 20,
        'proxy' => 'tcp://my-proxy:3128',
        'request_fulluri' => true 
    ),
    'ssl' => array(
        'SNI_enabled' => false // Disable SNI for https over http proxies
    )
));
echo file_get_contents('https://my-stream', false, $context);
于 2013-10-14T14:11:22.747 に答える