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>';
Вот собственно и все. Остальное оформление страницы ограничено только вашей фантазией.