htaccess:如何将请求转发到禁用文件夹?

时间:2016-01-03 23:39:21

标签: php apache .htaccess mod-rewrite

期望的

  1. 用户来电domain.tld/download/file_01.zip
  2. htaccess调用private/download.php
  3. file_01.zip开始下载
  4. 注意:必须保护file_01.zip不受直接访问。

    简化文件夹结构

    root/
        public/
            .htaccess
            index.php
        private/            <<< this area is blocked from direct access >>>        
            files/
                file_01.zip            
                file_02.zip
            .htaccess
            download.php
    

    公开/ htaccess的

    RewriteRule ^download/(.*)?$ ./../private/download.php?file=$1 [NC,L]
    

    私人/ .htaccess (编辑)

    <IfModule !mod_authz_core.c>
       Order deny,allow
       Deny from all
    </IfModule>
    <IfModule mod_authz_core.c>
      Require all denied
    </IfModule>
    

    的download.php

    $file = 'files/'.$_GET['file'];
    
    // check: user allowed to download?
    // check: more stuff (security, etc.) ...
    
    forceDownload($file);
    

    RewriteRule有效,但我收到错误Forbidden: You don't have permission to access [...] on this server,可能是因为用户调用了请求,而不是服务器

    有什么想法吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

作为RiggsFolly stated in their comment

您需要将private/ .htaccess文件修改为:

<IfModule !mod_authz_core.c>
   Order deny,allow
   Deny from all
   Allow from 127.0.0.1 #or your server address/etc
</IfModule>

这是另一个解决方案,假设你的Apache版本是 >=2.4 。 (通过使用Require

<IfModule !mod_authz_core.c>
    Require all granted
    Require ip 127.0.0.1
</IfModule>

答案 1 :(得分:1)

还有一种方法。重命名特定目录(例如,在它之前添加一个点的当前名称,AVFileTypeMPEG4)并将其放在.htaccess文件中。

.private

添加此规则后,将禁止/保护以RewriteRule (^\.|/\.) - [F] 开头的每个文件和目录,就像.htaccess一样。 :)

这将阻止除PHP以外的任何人访问以打开,查看,修改文件/目录内容。

以下是(非常常见的)基本.htaccess *(位于DOCUMENT_ROOT目录中)mod_rewrite规则的示例。

.

完成此操作后,您无法直接链接到.zip或任何文件分机。你有这个想法,但是用其他方式用最喜欢的PHP&#39;技巧来做到这一点。你的。 :)

如果你认为这会给你很多代码重构,只是因为一个目录,你可以将这些点添加到zip文件,并将它们移动到别处,直接访问虚线文件,仍然无法实现。