【问题标题】:Serving Large Protected Files in PHP/Apache在 PHP/Apache 中提供大型受保护文件
【发布时间】:2010-07-06 15:07:21
【问题描述】:

我需要从 Apache Web 服务器提供大文件 (> 2gb)。这些文件是受保护的下载,所以我需要某种方式来授权用户。我使用的 CMS 使用针对 MySQL 数据库检查的 cookie 来验证用户。在服务器上,我无法控制 max_execution_time,并且对 memory_limit 的控制有限。

我的技术一直适用于小文件。用户在 PHP 中(由 CMS)获得授权后,我使用 readfile() 来提供文件,该文件存储在文档根目录之上以防止直接访问。我已经阅读了有关分块下载或使用 fpassthru 绕过 PHP 内存限制的技术。但我还没有找到绕过 max_execution_time 限制的技术。

我考虑将文件存储在文档根目录中,这样我们就可以完全绕过 PHP。但我不知道如何使用 htaccess 限制访问。我需要先根据数据库验证用户,然后才能为他们提供文件。

谢谢。

【问题讨论】:

  • 你试过使用 set_time_limit(0) 吗?

标签: php apache .htaccess large-files memory-limit


【解决方案1】:

我认为最好的解决方案:在您的 Apache 中安装 mod_xsendfile,让 PHP 脚本授权用户,并在成功时发送带有指向受保护文件位置的 X-Sendfile 标头的响应。从那时起,Apache 开始将文件提供给客户端。不是 PHP。

【讨论】:

  • +1 表示mod_xsendfile。不要在 PHP 中做这项工作。 Apache(或任何生产质量的 Web 服务器,就此而言)经过优化以提供文件。让它完成它的工作,让你的脚本解释器不碍事。 Lighttpd 支持相同的标头,Nginx 做同样的事情,但使用X-Accel-Redirect
  • mod_xsendfile 是更好的解决方案。但是,如果这对您不可用(共享托管/静态构建),那么我建议使用符号链接或硬链接(如下所述),因为您仍然可以将下载服务传递给 Web 服务器。
  • 链接是通过默默无闻的安全性。没有什么能阻止最终用户共享这些链接。在某些情况下这很好,但让我们诚实地权衡取舍。
【解决方案2】:
【解决方案3】:

如何使用符号链接?如果您有文件夹示例:

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');

这可能不是最便携的方法,但因为您正在重定向用户,所以网络服务器正在处理下载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 2017-02-06
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2022-08-17
    • 2011-01-13
    • 2017-05-23
    相关资源
    最近更新 更多