2012-12-05 6 views
1

J'essaie d'obtenir le contenu d'un flux sur HTTPS, mais je dois passer par un proxy HTTP. Je ne voudrais pas utiliser cURL mais plutôt utiliser fopen avec un argument contexte. La chose est, je ne peux pas le faire fonctionner sur HTTPS (HTTP fonctionne bien cependant).PHP - flux https via proxy http

Ce ne pas travail:

$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); 

Ce FONCTIONNE travail (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; 

Quelqu'un sait ce qui ne va pas avec le premier morceau de code? Si cela fonctionne avec cURL, il doit y avoir un moyen de le faire fonctionner avec un contexte. J'ai essayé de changer les options de contexte à un tas de valeurs différentes sans aucune chance.

Toute aide serait grandement appréciée!

Merci.

+0

D'après ce que je me rappelle, la clé du tableau passé à 'stream_context_create' est le protocole sera utilisé. Essayez de passer la clé de http à https. – sberry

+0

Merci, mais j'ai essayé, sans succès. J'ai lu des extraits de code où les gens font une demande https sans changer la clé de 'https'. La seule différence ici est que j'utilise un proxy:/ – pcdl

+1

Changer la clé de 'https' est incorrect! Les appels 'https: //' utiliseront le contexte 'http', puis le contexte de transport' ssl' sous-jacent. –

Répondre

7

Vous n'avez pas spécifié le message d'erreur exact, essayez d'ajouter ignore_errors => true. Mais si vous obtenez un 400 Bad Request d'Apache, le problème que vous rencontrez probablement, est une incompatibilité d'en-tête d'hôte & de nom de serveur. Il y a aussi un bug PHP lié à ceci: https://bugs.php.net/bug.php?id=63519

Essayez le correctif suivant jusqu'à ce que ce bug est résolu:

$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); 
+0

Cela a fonctionné pour moi. Merci! – Dave