Apache. Листинг директорий

29 июля 2011 г.

Логотип ApacheКак-то раз задался целью преобразить скучный листинг директорий, который предоставляет веб-сервер Apache, на более гибко настраиваемый. Задача заключалась в том, чтобы передать обработку директорий одному единственному php скрипту. Вариант с файлом index.php в каждой директории меня не устраивал, ибо при внесении каких-либо изменений, приходилось править каждый файл.
Идея в следующем: при обращении к какой-либо директории, например httр://127.0.0.1/mydir/, сервер возвращает индексный файл. Имена файлов указаны в конфиге апача httpd.conf:

DirectoryIndex index.php

Если такого файла в каталоге mydir не существует, то выводится список файлов данной директории. Но если добавить файл, скажем, listdirectory.php в корень нашего сервера и указать его в настройках такм образом:

DirectoryIndex index.php /listdirectory.php

то все директории, в которых отсутствует index.php будут обрабатываться listdirectory.php.

Следующий шаг, обработка ссылок на файлы и субдиректории. Здесь ключевым моментом является определение абсолютного адреса текущей директории:

$path = iconv('UTF-8','windows-1251',urldecode($_SERVER["REQUEST_URI"]));

Строку запроса нужно декодировать из URL в текст и представить в той кодировке, которая будет использована на странице, в моем случае это cp1251. Также следует учитывать, что при формировании ссылки, символы пробела следует заменить на “%20”.

Вот готовый пример скрипта:

$path = iconv('UTF-8','windows-1251',urldecode($_SERVER["REQUEST_URI"]));
echo '<b>~$'.$path.'</b>';
$path = $_SERVER['DOCUMENT_ROOT'].$path;
$files = scandir($path);
echo '<table>';
echo '<tr><td><a href='.str_replace(" ","%20", $files[1]).'><b>..</b></a></td></tr>';
for($i = 2; $i < count($files); $i++)
  if(scandir($path."/".$files[$i]))
    {
      echo '<tr><td><a title="Открыть" href='.str_replace(" ","%20", $files[$i]).'>'.$files[$i].'</a></td></tr>';
      continue;
    }
for($i = 2; $i < count($files); $i++)
{
  if(!scandir($path."/".$files[$i]))
  {
    echo '<tr><td><a title="Скачать '.$files[$i].'" href='.str_replace(" ","%20", $files[$i]).'>'.$files[$i].'</a></td></tr>';
    continue;
  }
}
echo '</table>';

Вот собственно и все. Остальное оформление страницы ограничено только вашей фантазией.

Теги:
рубрика PHP
  • Похожие статьи
  • Предыдущие из рубрики