2011-05-26 458 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的......」)至極的作品就好了;)