【问题标题】:Filtering web folders via Apache and PHP通过 Apache 和 PHP 过滤 Web 文件夹
【发布时间】:2011-06-29 00:04:19
【问题描述】:

我正在寻找一种方法来过滤和控制对网站上文件夹的访问。

不过,我想做的是通过 PHP 和 Apache 过滤访问请求,有点像在 Java 中实现过滤器的方式。

所以,当用户尝试访问时

http://www.mywebsite.example/files/afile.zip

我希望它首先通过 PHP 脚本,以确保用户不会尝试多次下载同一个文件,或者正在做其他可能破坏网站的事情。

这样的事情可能吗?我知道可以简单地将文件移动到文档根目录之上,然后以这种方式提供它们,但我一直在寻找更优雅的东西。

我可以使用 .htaccess 和 mod_rewrite 的任意组合来执行此操作吗?

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    我认为将文件移动到 web 根目录之上比在 mod_rewrite 周围乱搞更优雅。只是说。它们要么直接提供并属于网络根目录,要么不提供,因此不提供。

    无论如何,这很容易做到,在files/.htaccess

    RewriteEngine On
    RewriteRule . validate.php?file=$0
    

    validate.php 现在应该可以访问$_GET['file'] 中的请求文件名。

    (代码未经测试;如果您遇到错误,请告诉我。mod_rewrite 从来没有真正喜欢过我。)

    【讨论】:

    • 如果我在浏览器中输入以下内容:files/validate.php 会怎样?那会造成《DOOM》的无限循环吗?
    • @Marco Ceppi - 如果没有安全锁,validate.php 可能会被用作下载。仅当我们实际重定向到要下载的文件时,重定向才适用,我认为情况并非如此。
    • @Marco Ceppi - 哦,我现在明白了。不要将includerequire 用于此类事情。使用file_get_contents 并提供原始数据。否则,您会遇到涉及 PHP 代码隐藏在 EXIF 数据中的安全问题、二进制文件最终在某处包含 <? 时不可避免的错误,等等。
    【解决方案2】:

    您可以在 .htaccess 中添加类似的内容:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/files/(.+)\.zip$ path/to/phpscript.php?file=$1.zip [L,NC,QSA]
    

    这会将文件的所有请求重定向到该脚本。您可以对任何用户数据进行逻辑检查,然后设置标头 Content-Type、文件名,并将文件的流读入浏览器。

    我需要提一下路径(在这种情况下“/files/”不应该存在。您可能希望将文件实际保留在公共网络之外并创建指向 /files/NAME 的所有文件的链接.EXT

    最后,该代码仅适用于 ZIP,您可以执行以下两个示例。 First 将仅针对一系列文件扩展名运行。第二个将获取 /files/ 路径之后的任何文件。

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/files/(.+)\.(zip|pdf|exe|msi)$ path/to/phpscript.php?file=$1.$2 [L,NC,QSA]
    

    第二:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/files/(.*)$ path/to/phpscript.php?file=$1 [L,NC,QSA]
    

    然后您需要创建一个脚本“phpscript.php”,如下所示:

    <?php
    
    $file = $_GET['file'];
    $path = "secret/non-webpublic/path/";
    if( is_file($path . $file) )
    {
        //Check if USER can view file
    }
    else
    {
        header("HTTP/1.0 404 Not Found");
        die();
    }
    
    ?>
    

    类似的东西。

    【讨论】:

      【解决方案3】:

      我会为此使用 mod_rewrite。 我过去做过类似的事情,用户可以下载视频,但必须确保他们已登录。 是这样的:

      href="/video/download/path-to-file.ext"
      

      在我的 .htaccess 中

      RewriteEngine on
      RewriteRule ^video/download/(.*)?$ video-download.php?path=$1 [QSA,L]
      

      在我的 video-download.php 中,我检查了他们是否已登录,跟踪谁下载了视频等,然后将他们扔到下载对话框中。

      header('Content-Description: File Transfer');
      header('Content-Type: application/octet-stream');
      header('Content-Length: ' . filesize($filename_location));
      header('Content-Disposition: attachment; filename=' . basename($filename));
      readfile($filename_location);
      

      在您的情况下,一旦他们点击此页面,您就想为他们的会话添加一个计数器,并以此为基础制定您的逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-11
        • 2021-08-07
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多