如何通过PHP和/或Apache保护大文件下载?

我们有一些不能公开访问的大文件(1-8GB)。 目前我们正在通过一个PHP脚本来提供它们,caching1MB块的文件并将其写入输出。 这是令人难以置信的CPU密集型,并在只有几个下载活动时减慢服务器。 我们希望将文件传输工作转移到Apache或更高效的方法。 我们正在使用cookieauthentication。 除非有一些方法通过现有的PHP会话cookie来validationFTP会话,否则FTP下载已经结束。

理想情况下,我们希望能够使用PHP隐藏文件链接,同时将文件传输工作传递给Apache,这对于HTTP文件传输无疑比PHP更高效。 我们希望能够恢复下载。

任何帮助表示赞赏。

X-Sendfile专门用于这种types的操作。 你可以阅读http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/

mod_auth_tkt看起来很有趣。 如果您在UNIX上托pipe的Apache / PHP设置,这是一个低技术解决scheme:

将您的下载保存在非Web可访问的目录中,然后使用PHP脚本创build独特的符号链接。 然后,您可以在指定的时间段后(例如24小时后)删除符号链接。

这是一个例子。 假设您的文件存储在/ private,并由.htaccess文件保护。 您还有一个/ public目录,可以由Apache运行的用户写入。

伪代码:

  1. 用户去下载页面
  2. PHP脚本生成一个唯一的下载标识符,用作符号链接文件名(例如:79467404-7585-11df-9ead-0022190d59d2)
  3. PHP脚本创build一个从/ public / 79467404-7585-11df-9ead-0022190d59d2到/ private / file1的符号链接
  4. PHP脚本将用户redirect到http://example.com/public/79467404-7585-11df-9ead-0022190d59d2允许文件下载

然后可以使用cronjob运行“find / public -type l -mtime +24 -exec rm {} \;” 或类似的东西删除过期的符号链接。 (注意:使用find删除文件时要非常小心。)

此解决scheme不会阻止用户在接下来的24小时内共享链接,因此在重要的情况下可能不合适。 但是它不需要额外的Apache模块等

这Serverfault问题可能是相关的。 或者,你可以使用类似mod_auth_tkt的东西。

我已经使用了一个服务调用Net 2 FTP,这是一个纯粹的HTML / PHP接口在线访问FTP帐户。 您可以相对容易地下载和安装软件,因为它是一个如此小的网站,所以没有任何开销。

这个软件是非常有用和易于使用,听起来像它会是完美的使用。

主页是http://www.net2ftp.com/ ,它是完全免费的。