【问题标题】:Make Apache use PHP to control access to files / directories让 Apache 使用 PHP 来控制对文件/目录的访问
【发布时间】:2013-10-04 16:44:13
【问题描述】:

我正在做一个人们可以上传文件的网站。文件可以是公共访问的,也可以是私人访问的。为了避免编码问题,我将具有随机名称的文件存储在“隐藏”目录中。 但是,如果我们知道 url,则可以直接访问 public 文件夹。 (这不是问题)。

我的公共部分没问题,我的 php 脚本给用户一个如下所示的 url:
http://example.com/d/1/524dd711c3102/b1bi.png

而 apache 使用以下命令控制访问:

RewriteRule ^d/(\d+)/([a-zA-Z0-9]+)/(.+)$  ./files/public/$1/$2 [L]

到目前为止,一切都很好。

但现在,棘手的部分是私人文件。我需要只有上传文件的用户才能访问该文件。我想避免使用一些 readfile 或 file_get_contents 或类似的东西的基于 PHP 的解决方案。

事实上,我会想象这样的事情:

用户尝试访问./files/private/< folder_id>/< file_id>,Apache “询问”一个 PHP 文件是否正常。

问题是,我认为这是不可能的。

所以:

  1. 有可能吗?如果有,怎么做?
  2. 您能想出更好的解决方案吗? (我想使用标准的 Apache/http 身份验证,但限制每个用户的访问会很棘手。

(我也可以使用 XSendFile,但我希望用户能够阅读/观看网站上的文件而无需下载(例如图片))

谢谢:)

【问题讨论】:

  • 我不认为你可以让 Apache “询问” php 是否允许用户访问文件。
  • 你如何验证你的用户?
  • 您说要避免的 php 是您应该采取的方法。为什么要避免它?
  • @EtienneMiret:“基本”PHP 身份验证。查看数据库的登录表单
  • @Dagon:因为它又慢又重。

标签: php apache authentication


【解决方案1】:

mod_rewrite中有RewriteMap,可以使用外部数据源提供一些重写规则/映射。但是,性能可能非常糟糕。

检查:http://httpd.apache.org/docs/current/rewrite/rewritemap.html#prg

【讨论】:

    【解决方案2】:

    您可以结合垃圾收集器 (http://php.net/gc) 使用 fread() 并将 1kb 的块读取/发送到浏览器,这在内存中应该不成问题。

    使用fread(),您只需保存文件中的一个位置和文件的一部分。

    这将只比 Apache 小一点,但您拥有完全的访问控制,这在所有情况下都是值得的。

    其他网站将 BLOBS 中的大数据保存到数据库中,您甚至不会注意到。

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 2015-04-03
      • 1970-01-01
      • 2011-08-27
      • 2023-04-09
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多