Apache-2.2

如何保護通過 PHP 和/或 Apache 下載的大文件?

  • June 11, 2010

我們有一些不可公開訪問的大文件 (1-8GB)。目前,我們通過一個 PHP 腳本為它們提供服務,該腳本將文件緩衝為 1MB 塊並將其寫入輸出。當只有少數下載處於活動狀態時,它非常消耗 CPU 並減慢伺服器速度。我們希望將文件傳輸工作轉移到 Apache 或更高效的方法。我們正在使用 cookie 身份驗證。除非有某種方法可以通過現有的 PHP 會話 cookie 對 FTP 會話進行身份驗證,否則 FTP 下載將停止。

理想情況下,我們希望可以使用 PHP 隱藏文件的連結,同時將文件傳輸工作交給 Apache,這無疑在 HTTP 文件傳輸方面比 PHP 更有效。我們也希望能夠恢復下載。

任何幫助表示讚賞。

X-Sendfile 是專門為這種類型的操作而製作的。您可以在http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/閱讀有關它的資訊

mod_auth_tkt 看起來很有趣。如果您的 Apache/PHP 設置託管在 UNIX 上,這是一個低技術解決方案:

將您的下載內容保存在不可通過 Web 訪問的目錄中,然後使用 PHP 腳本在其中創建唯一的符號連結。然後,您可以在指定時間段後(例如 24 小時後)刪除符號連結。

這是一個例子。假設您的文件儲存在 /private 中並受 .htaccess 文件保護。您還有一個 /public 目錄,該目錄可由執行 Apache 的使用者寫入。

虛擬碼:

  1. 使用者進入下載頁面
  2. PHP 腳本會生成一個唯一的下載 ID,用作符號連結文件名(例如:79467404-7585-11df-9ead-0022190d59d2)
  3. PHP 腳本創建一個從 /public/79467404-7585-11df-9ead-0022190d59d2 到 /private/file1 的符號連結
  4. PHP 腳本將使用者重定向到http://example.com/public/79467404-7585-11df-9ead-0022190d59d2允許文件下載

然後,您可以使用 cronjob 執行“find /public -type l -mtime +24 -exec rm {} ;” 或類似於刪除過期符號連結的東西。(注意:使用 find 刪除文件時要非常小心。)

此解決方案不會阻止某人在接下來的 24 小時內共享連結,因此在重要的情況下它可能不合適。但它不需要任何額外的 Apache 模組等。

引用自:https://serverfault.com/questions/149786