Apache 列出文档根目录之外的所有子目录和文件

Apache 列出文档根目录之外的所有子目录和文件,apache,scandir,php,Apache,Scandir,Php,我有一个在文档根目录中执行的索引脚本,它位于: /var/www/mywebsite/protectedfolder/index.php 现在,我在文档根目录之外有一个目录,其中包含一个包含文件的子目录列表: /var/www/uploads/LIST OF SUBDIRECTORIES/file 当uploads文件夹位于文档根目录中时,我使用了以下代码: <?php $dir = "/var/www/uploads"; $list = scandir($dir); /* This f

我有一个在文档根目录中执行的索引脚本,它位于:

/var/www/mywebsite/protectedfolder/index.php

现在,我在文档根目录之外有一个目录,其中包含一个包含文件的子目录列表:

/var/www/uploads/LIST OF SUBDIRECTORIES/file
当uploads文件夹位于文档根目录中时,我使用了以下代码:

<?php
$dir = "/var/www/uploads";
$list = scandir($dir); /* This function sorts dirs */
$list = array_diff($list,array(".","..","index.php"));

echo "<ol>";
foreach ($list as $file)
{
   if (!is_dir($file)) echo "<li><a href='https://mysite.ca/protected-folder/uploads/$file'>$file</a></li>\n";
}
echo "</ol>";
?>

但是,除非已登录并有权访问此脚本,否则此文件夹必须是公用的专用文件夹

如何创建指向文档根目录外文件夹的链接?如果单击该链接,如何显示该目录内的文件

编辑:为了让我的问题更清楚,uploads文件夹将有两层子目录,这是一个未知的编号:
/var/www/uploads/unknown LIST of SUBDIRECTORY LEVEL 1/unknown SUBDIRECTORY LEVEL 2/所有文件(文件可以是任何文件类型)

以前的做法是使用apache索引允许用户遍历子目录。这需要是安全的,以防止直接url访问,因此这就是我希望它的工作方式:

  • 列出所有第一个子目录链接(指向所有子目录级别1的链接)

  • 然后单击链接后,列出子目录级别1中的所有子目录级别2文件夹

  • 最后,如果单击该链接(子目录2),则显示子目录2中的所有文件


  • 希望这能把事情弄清楚

    您的代码不在乎目录是在文档根目录内还是在文档根目录外。只需链接到一个PHP文件来检索文件本身(而不是链接到文件上传,因为它不可用)。要检索文件,只需使用脚本获取内容并将其输出即可

    大概是这样的:

    <?php
    $path = '/var/www/uploads';
    $file = do_something_to_make_this_safe($_POST['file_to_retrieve']);
    
    $type = mime_content_type( $path . '/' . $file );
    $contents = file_get_contents($path . '/' . $file);
    
    header('Content-Type: ' . $type);
    header('Content-Disposition: attachment;filename=' . $file);
    print $contents;
    
    ?>
    
    
    

    注意:您需要确保没有人用
    之类的东西污染文件路径。
    才能尝试访问被禁止的文件。(因此,
    做点什么来确保这个安全()

    我如何获得帖子信息?此脚本需要是自动的,不应从用户处获取任何信息。它应该只输出每个目录中可以获取或发布的文件。您现有的应用程序输出链接。用户是否没有单击这些?该链接的内容类似于
    ,但链接连接到的是目录而不是文件。此外,它也不是一个可检索的文件。这将是一个未知数量的文件,所以这将需要在一个for循环。你能用我的代码重写这个函数,使它更符合我的问题吗?我不确定你想实现什么。现有代码读取目录并输出其中的文件。我的函数是一个例子,说明你可以做些什么来给你一个方向。因此,这不是一个让人们为您编写代码的地方。让它与你的需求相关,如果你陷入困境,那么回来问问。