2014-09-10 53 views
0

我有兩臺服務器,在我的網站正在運行的第一個用戶與之交互。如何使用php重定向從另一臺服務器下載

第二個創建應該由用戶下載的某些文件,但用戶不應該知道第二臺服務器。

另一個小問題:我的第二個服務器使用的htaccess

客戶< ---> Web服務器< --->文件服務器

我怎麼能執行一個下載的第一臺服務器,其中,文件實際上來自第二個,沒有使第二個服務器的URL公開?

回答

0

一是理念

  1. 文件服務器
  2. Web服務器
  3. 客戶

您的客戶端上傳文件的這樣。

<form action="#" method="post" enctype="multipart/form-data"> 
    <input name="file" type="file" /> 
    <button type="submit" name="send">Send</button> 
</form> 

然後你可以使用它。

<?php 

// Deny access from all except your first (file) server 
$publicDir = '/srv/www/private/'; 

$fileName = basename($_FILES['file']['name']); 
$filePath = $publicDir . $fileName; 

if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) 
{ 
    shell_exec("ssh [email protected] 'cd /srv/www/mypath && wget \"http://srv/private/" . $fileName . "\"' 2>&1"); 
} 

第二個想法

使用mogilefs,安裝文件服務器和Web服務器上使用。 因此,您可以將文件添加到包含文件服務器的「mogilefs」中。 稍後,您可以添加更多服務器而不會出現問題。

第三個想法

在Linux上,你可以安裝到你的文件服務器的路徑(例如到/ mnt /文件服務器)。 然後,您可以給www-data寫入目錄的權限。 然後你可以將move_uploaded_file加載到安裝的目錄中。

在這種情況下,您可以輕鬆處理這些文件。

+0

謝謝,但我需要下載一個文件,而不是把它上傳。文件在文件服務器上創建。我糾正了標題 – 2014-09-10 09:20:17

+0

然後使用nginx規則重定向(內部)與proxy_pass或直接使用'shell_exec('wget''。$ neededFile。'「');'並使用該文件。之後'取消鏈接($ neededFile);'或者你使用二/三的想法。應該完美地工作:) – PatrickB 2014-09-10 09:36:28

0

搞到現在

$file = "myURL" 
    $htaccessLogin = "user:password" 
    set_time_limit(0); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $file); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_USERPWD, $htaccessLogin); 
    $r = curl_exec($ch); 
    curl_close($ch); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); 
    header('Cache-Control: private', false); 
    header('Content-Type: application/force-download'); 
    header('Content-Disposition: attachment; filename="'myfile.zip"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . strlen($r)); 
    header('Connection: close'); 
    echo $r; 
0

是否使用Apache的工作?

嘗試mod_proxy的Apache documentation

ProxyPass /foo http://foo.example.com/bar 
ProxyPassReverse /foo http://foo.example.com/bar 

/foo是Server1上的路徑(其中這個配置放置)和代表其請求到Server2

有了這個,你可以設置這樣的事情

http://server1.tld/download/file => server2。TLD /文件

,而用戶看到服務器2

我用這主要是爲了提供一個端口代理的URL。我有一個服務在80以外的端口上運行,我想在http標準端口上提供它。

最佳,安德烈

添加的HTTP基本驗證可能性

發現here

你也有下面幾行加入Apache的配置,在代理規則最好的未來。

<Location /foo> 
RequestHeader set Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQK" 
</Location> 

背後基本的散列將與此命令生成:

> $ echo "username:password" | base64 
dXNlcm5hbWU6cGFzc3dvcmQK 
+0

聽起來不錯,但它也可以用htaccess嗎? – 2014-09-10 11:14:27

+0

是的,這是可能的。如果找到解決方案[這裏](http://superuser.com/questions/704781/apache-mod-proxy-with-automatic-authentication) 你只需要創建一個到你的apache配置文件包括基本認證哈希。 我會將其添加到我的解決方案。 – 2014-09-11 08:49:26

相關問題