2011-05-26 38 views
3

我有以下格式(我把它写成是aregex)的网址:如何通过从https源下载到http连接?

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

的URL是由客户端通过我的代理服务器要求。

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

但是,这个网址给了302重定向到另一个来源,最终应该到达客户端。

这其他网址是SSL加密,看起来像:

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

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

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

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

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

我想过是这样的:

proxy.php - 使用反向代理请求,并通过网络服务器 该代理PHP是由htaccess的重写规则写入并通过http://one-or-my-domoains/request-uri-from-the-original-request的梦幻代理所提供文件(即在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

可能是值得一问这对ServerFault了。 – Boldewyn 2011-05-26 10:00:40

+0

你是对的,谢谢你提醒我回合。我认为它是一个应用程序问题,但总体领域可能更多与那里找到的expertiese相对应 – 2011-05-26 10:22:09

回答

0

以及我最终只是在做中继(“wget的......”)至极的作品就好了;)