2010-07-06 25 views
5

我需要從Apache Web服務器提供大型文件(> 2GB)。這些文件是受保護的下載文件,所以我需要某種方式來授權用戶。我正在使用的CMS使用cookie檢查MySQL數據庫來驗證用戶。在服務器上,我無法控制max_execution_time,並且無法控制memory_limit。在PHP/Apache中提供大型受保護文件

我的技術一直在爲小文件工作。用戶通過PHP(由CMS)授權後,我使用readfile()來提供文件,該文件存儲在文檔根目錄上方以防止直接訪問。我已閱讀過大量下載技術或使用fpassthru來解決PHP內存限制問題。但是我還沒有找到解決max_execution_time限制的技術。

我曾考慮將文件存儲在文檔根目錄中,因此我們可以完全繞過PHP。但我無法弄清楚的是如何用htaccess限制訪問。我需要根據數據庫驗證用戶,然後才能爲其提供文件。

謝謝。

+0

您是否嘗試過使用set_time_limit(0)? – igorw 2010-07-06 15:15:18

回答

3

我認爲最好的解決方案是:在您的Apache中安裝mod_xsendfile,讓PHP腳本授權用戶,並在成功發送指向受保護文件位置的標題的響應。從那時起,Apache就開始向客戶端提供文件服務;不是PHP。

+0

對於'mod_xsendfile' +1。不要在PHP中完成這項工作。阿帕奇(或任何生產質量的Web服務器,就此而言)已經過優化以提供文件。讓它做好工作,讓你的腳本解釋器不受阻礙。 Lighttpd支持相同的頭文件,Nginx可以做同樣的事情,但使用'X-Accel-Redirect'。 – 2010-07-12 21:56:43

+1

mod_xsendfile是**更好的**解決方案。但是,如果這不適用於您(共享主機/靜態構建),那麼我建議使用符號鏈接或硬鏈接(如下所述),因爲您仍然可以將下載服務傳遞到Web服務器。 – 2010-07-12 21:59:37

+1

鏈接是默默無聞的安全。沒有什麼能阻止最終用戶分享這些鏈接。在某些情況下沒問題,但讓我們誠實地對待這些權衡。 – 2010-07-12 22:02:25

1

怎麼樣使用符號連接?如果你有一個文件夾,例如:

userfacingfiles/ 
    md5_of_order_id1 --> protected-file.exe 
    md5_of_order_id2 --> protected-file.exe 

protectedfiles/ 
    .htaccess (contains deny from all) 
    protected-file.exe 

基本示例:

$salt = 'canttouchthis'; 

function create_symlink($order_id, $salt, $protected_file) 
{ 
    $info = pathinfo('protectedfiles/'.$protected_file); 

    symlink('protectedfiles/'.$protected_file, 'userfacingfiles/'.md5($order_id.$salt).'.'.$info['extension']); 
} 


function get_file($order_id, $salt, $extension) 
{ 

    header('Location: userfacingfiles/'.md5($order_id.$salt).'.'.$extension); 
    exit(); 
} 

用法:

當用戶支付:

create_symlink(1, 'secureSALT', 'ebook.pdf'); 

當用戶希望下載他們的電子書

get_file(1, 'secureSALT'); 

這可能不是最便攜的方法,但是因爲您正在重定向用戶,Web服務器正在處理下載。

相關問題