Мой mod_autoindex
Испокон веков в Apache (внимание! речь идёт об Apache 1.x) существует модуль mod_autoindex — в комментариях в его исходном коде есть дата, видимо написания первой версии — 23 марта 1993 года. С тех пор модуль, очевидно, претерпевал какие-то изменения, но с 1993 года форматирование вряд ли изменилось — всё тот же тег PRE.
С 1993 года HTML обогатился таблицами и каскадными стилями (CSS). Вряд ли сейчас кто-то использует браузеры не знающие что это такое, странно, что для вывода информации в модуле mod_autoindex до сих пор используется PRE. Сам по себе модуль очень неплох — он позволяет быстро (часто для этого вообще ничего не надо делать — просто убрать индексный файл из папки) организовать файловые архивы, а главное — организовать их без использования относительно медленного скриптинга, что может часто бывает критично для сервисов, пользующихся большой популярностью.
В моём портфолио есть несколько проектов, где приходилось изобретать какие-то вещи (где-то, наверняка, велосипеды, знания о всех готовых решениях у меня нет) для улучшения производительности. Как я уже сказал, для огранизации файловых архивов иногда очень удобно использовать модуль mod_autoindex. Удобно, да вот незадача — владельцу сервиса, как правило, помимо производительности важна такая вещь как дизайн, оформление.
Стандартный модуль Apache позволяет менять, в этом плане:
- header, т. е. часть над списком файлов (HeaderName, SuppressHTMLPreamble)
- footer, часть под списком файлов (ReadmeName)
- размер иконок (IconWidth, IconHeight)
- внешний вид иконок (AddIcon, AddIconByType, AddIconByEncoding)
- убирать из списка некоторые столбцы (SuppressLastModified, SuppressSize, SuppressDescription)
- изменять описание файла (AddDescription)
- и весьма ограниченно менять внешний вид выводимой информации (FoldersFirst, SuppressColumnSorting и т. п.)
Чаще всего этого для «упаковки» списка файлов в дизайн очень мало. Для облегчения задачи интеграции вывода mod_autoindex в дизайн я несколько усовершенствовал этот модуль. Всё по порядку.
Что умеет новый модуль
- Режим FancyIndex всегда включен и не выключается. Вряд ли найдётся много людей
не использующих этот режим. - В основном режиме (об этом подробнее — чуть ниже) таблица файлов выводится при
помощи тега TABLE, где у большинства объектов (например, у первой строка, чётных
и нечётных строк) прописаны идентификаторы CSS-классов, из чего следует, что внешний
вид таблицы вы легко сможете задать при помощи файла стилей. - Новая опция, позволяющая включить в листинг файла ссылку на корень сайта
(IndexOptions +RootFolder, при использовании не забудьте добавить иконку,
например так: «AddIcon /icons/back.gif .») - Появилась возможность перенести Description в отдельную (новую) строку
(IndexOptions +DescriptionAtNewRow) - Появилась возможность локализовать (перевести на родной язык) текстовую
информацию модуля (директивы ParentStr, RootStr, NameStr, SizeStr, DescriptionStr, LastModifiedStr). - С первой страницы (если пользователь находится в корне сайта) убрана
ссылка «Parent Directory», ведущая в этом случае, на ту же самую страницу. - Появился новый режим вывода, основанный на теге SPAN (именно он на иллюстрации),
в частности, количество иконок в строке в этом режиме зависит от ширины окна браузера
(IndexOptions +BoxWidth=N +BoxHeight=N +MaxIconHeight=N)
Новый режим вывода
Новый режим вывода включается автоматически, если были использованы параметры BoxWidth и BoxHeight. Эти два параметра отвечают за размер прямоугольника, в который заключена иконка (на иллюстрации выделено чёрным) и, по сути, определяют расстояние между соседними иконками.
Размер этот нужно выбирать исходя из размеров иконки, текста названия файла и строки, где выводится размер файла, плюс некоторое пространство, необходимое для обеспечения зазора между соседними иконками. Есть ещё один параметр — MaxIconHeight, выбрать его просто — это всего лишь максимальная высота иконки в вашем наборе. Нужен этот параметр для того, чтобы подписи к иконкам располагались на одном уровне (на иллюстации — синяя линия).
В этом режиме под иконкой выводится имя файла, размер и дата модификации (если, конечно, не были использованы опции SuppressLastModified и SuppressSize), описание файла выводится в аттрибут «title» тега SPAN, охватывающего иконку и надписи (если не была использована опция SuppressDescription) — вы можете использовать DHTML, чтобы выводить информацию из title в статусную строку, всплывающую подсказку и т. п.
Пример
Файлы для вывода информации так, как это изображено на иллюстрации выглядят так:
Файл «.htaccess»:
IndexOptions +SuppressHTMLPreamble +NameWidth=*
IndexOptions +SuppressLastModified +FoldersFirst +RootFolder +DescriptionWidth=*
IndexOptions +BoxWidth=80 +BoxHeight=80 +MaxIconHeight=33
HeaderName /_bolk_autoindex/.HEADER.html
ReadmeName /_bolk_autoindex/.FOOTER.html
ParentStr "Наверх"
RootStr "В корень"
NameStr "Имя"
SizeStr "Размер"
DescriptionStr "Описание"
Файл «.HEADER.html»:
<head>
<title></title>
<style type="text/css">
td,
body { background-color: white; font-family: Verdana,Tahoma; font-size:10px }
a { color: black; text-decoration:none }
.cell0, .cell1 {text-align: center}
a:hover { text-decoration: underline }
</style>
</head>
<body>
<h4>Пример использования</h4>
Содержимое каталога:
<!--#echo var="DOCUMENT_URI" encoding="none" -->
<br clear="all" /><br />
Файл «.FOOTER.html»:
</body>
Где взять и как установить
Файл можно взять у меня на сайте (ZIP, около 15Кб), для установки нужно переписать его на место старого модуля (каталог src/modules/standard) и перекомпилировать Apache. Проблемы и их решения
Часто, помимо имени файла, его размера и даты создания, хочется вывести другую полезную информацию — например, разрешение для картинок, ID3 теги для MP3 файлов и так далее. Для этой цели я рекомендую воспользоваться полем «Description» и директивой «AddDesription». Задачей модуля не является и, надеюсь, не будет являться (иначе это приведёт к снижению производительности) автоматический вывод информации такого рода. Напишите скрипт (кстати, возможно позднее я его выложу), который пробежит по каталогам и добавит эту информацию в соответствующие .htaccess файлы и вызывайте его далее по мере необходимости.
Один из заказчиков попросил предоставить пользователю возможность самому выбирать какой вид листинга файлов он хочет получить — табличный или в виде иконок. К сожалению, у Apache 1.x нет методов переключения конфигурации в зависимости от каких-то внешних условий «на лету», так что было выбрано такое решение. На портах 80 и 443 (обычно используется для HTTPS-соединений) были заведены два виртуальных хоста:
<VirtualHost example.com:80>
...
AccessFileName .htaccess .htaccess-table
...
</VirtualHost>
<VirtualHost example.com:443>
...
AccessFileName .htaccess .htaccess-icons
...
</VirtualHost>
где прописаны одно общее имя .htaccess-файла для общих настроек и деректив AddDescription и два разных имени для различных наборов настроек mod_autoindex. Переключение происходит перенаправлением пользователя на определённый порт. Хотелось бы ещё...
По всем вопросам, с пожеланиями по улучшению — добро пожаловать в мой почтовый ящик, он есть на моём сайте внизу каждой страницы.