如何通过从https源下载到http连接?

时间:2011-05-26 09:56:25

标签: php http proxy https http-headers

我有以下格式的网址(我将其写为aregex):

http://exampledomain\.com/files/.+

客户端通过我的代理服务器请求URL。

我在此请求中注入了自定义授权标头。 这没问题,我可以用apache中的mod_proxy和mod_headers来做到这一点。

然而,这个url给另一个源提供302重定向,最终应该到达客户端。

这个其他网址是SSL安全的,看起来像:

https://example.+\.exampledomain.\com/files/.+/.+

它需要与另一个相同的授权标头。但因为它的hTTPS我不能简单地使用mod头注入它。

因此,我的计划是设置一个反向代理,用于请求带有授权标头的第一个HTTP URL。后面是一个脚本,用于获取请求,解析第二个HTTPS URL并使用自定义授权标头下载源,并将收到的文件(字节和http标头)传递给客户端。

我熟悉Apache2和PHP,因此坚持使用theese会很不错。但它没有必要。

为了澄清,我们在这里谈论的是免费链接。我的公司在那里有备份文件和存储,因为它是最便宜的云托管。有些作业服务器需要获取文件,但我无法在其上配置用户/密码。因此代理服务器应该添加高级身份验证信息。

我想到了类似的东西:

proxy.php - 使用反向代理请求此文件,并由网络服务器提供 这个代理php是由htaccess重写规则和http://one-or-my-domoains/request-uri-from-the-original-request上的revery代理写的(在apache中生成)

$url = "http://example.com/".$_SERVER["REQUEST_URI"];
$opts = array(
  'http'=>array(
    'header'=>"Cookie: myauthvalue=example\r\n"
  )
);
$context = stream_context_create($opts);
stream_context_set_default($context);
$http_content = get_headers($url, 1);

$ssl_location = $http_content['Location'];

$fp = fsockopen("ssl://".parse_url($ssl_location, PHP_URL_HOST), 443, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET ".parse_url($PHP_URL_PATH, PHP_URL_HOST)." HTTP/1.1\r\n";
    $out .= "Host: ".parse_url($ssl_location, PHP_URL_HOST)."\r\n";
    $out .= "Cookie: myauthorization=something"; 
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

所以这应该基本上将ssl下载传递给用户启动的标准http连接,而不是重定向。

我现在的问题是:这会有效吗?我错过了什么?有没有洞穴?

我认为这将是一个合理的麻烦,包括反向代理设置和所有。

1 个答案:

答案 0 :(得分:0)

好吧,我最后只是做了passthru('wget ....'),它的工作得很好;)