PHP - 通过http代理的https流

时间:2012-12-05 18:53:04

标签: php curl https proxy stream

我正在尝试通过HTTPS获取流的内容,但我必须通过HTTP代理。 我不想使用cURL,而是使用 fopen context 参数。

问题是,我无法通过HTTPS工作(HTTP工作正常)。

不会工作:

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

DOES 工作(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;

有人知道第一段代码有什么问题吗?如果它与cURL一起使用,必须有一种方法使它适用于上下文。 我试图将上下文选项更改为一堆不同的值,但没有运气。

非常感谢任何帮助!

感谢。

1 个答案:

答案 0 :(得分:7)

您未指定确切的错误消息,请尝试添加ignore_errors => true。但是如果你从Apache获得400 Bad Request,你可能会遇到的问题是服务器名称指示&主机头不匹配。还有一个与此相关的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);