Приведення індексу apache до людського вигляду

Рис. 1.  Непрезентабельний індекс

Рис. 1. Непрезентабельний індекс

Використовую сервер в т.ч. і як файлсторе, і торенти туди стягаю, потім в спокійній обстановці скачую собі на локальне зберігання, і людям файли заливаю. Зазвичай, при відсутності індексного файла, апач виводить вміст каталогу в браузер. Так і я браузив свої коморки, і вибирав лінки для закачки, лише не тішив чомусь вигляд (Рис. 1.) Поведу розмову, як добивався приємнішого вигляду, це буде корисно не лише молодим адмінам :), а і власникам сайтів, так як всі поради застосовні і в оточенні шаред хостингу, через файл .htaccess. В ідеалі можна добитись просто невпізнаваності, є і така практика використання. Перевага такого рішення – неймовірна економія ресурсів, і простота.

Якийсь дефолтний напівжах. В межах реалізації проекту продуктивного затишного сервера, яким ще і люди користуватимуться таке теприпустимо.
Почав розбиратись, що й до чого. Індекс генерує модуль апача mod_autoindex, з настройками якого і потрібно бавцятись. Далі дивним було, чому значки файлів не показуються, якщо мали би (Рис. 2.)

Рис. 2. Дефолтний індекс

Рис. 2. Дефолтний індекс

Як виявилось, тут неув’язочка з nginx, тому все в комплексі і почав розрулювати.

По дефолту іконки посилаються на набір гіфок для кожного з типів файлів. Гіфки лежать у /icons/, тобто, виглядає, ніби потрібно покласти в корінь хоста ці значки, і буде радість. Та не все так просто. Насправді, існує ще один модуль – mod_alias, який (теж по дефолту) аліасить звернення з /icons/ до /usr/share/apache2/icons, принаймні в Debian. Модуль цікавий дуже, його багато для чого можна застосувати, і саме завдяки йому на всіх хостах при перегляді змісту каталогу є іконки, і шлях до них виглядає, ніби вони лежать в корені хоста.

В моєму випадку mod_alias не працював, так як перед apache запити обробляв nginx, і згідно попередньо визначених правил, статику віддає самотужки. А як її віддати, коли на місці немає? Одне питання. Потім друге. Дефолтні значки досить страшні, і хотілось би їх змінити на інші. А ще третє :) якось би css приліпити…

Щоб змінити значки, можна тупо замінити файли в /usr/share/apache2/icons іншими і тішитись. Але це неспортивно, в файлову структуру не хочеться лізти, формат gif то вже минуле століття, крім того, мало що дасть, бо і так треба ті іконки копіювати в корінь кожного хоста (хочу, щоб у всіх по дефолту було гарно!)

Є більш кардинальний, але правильніший шлях. В Debian файл /etc/apache2/httpd.conf порожній, і призначений для налаштунок адміністратора найвищого рівня. Те що треба. Вписав туди наступне:

#indexing options
 
#Alias /icons/ /var/www/srv.if.ua/icons/
AliasMatch ^/icons(.*) /var/www/srv.if.ua/icons$1
 
IndexOptions FancyIndexing IconsAreLinks XHTML HTMLTable SuppressDescription
IndexStyleSheet /service/index.css
# SuppressHTMLPreamble
#HeaderName /header.html
 
AddIconByEncoding (CMP,/icons/page_white_zip.png) x-compress x-gzip
 
AddIconByType (TXT,/icons/page_white_text.png) text/*
AddIconByType (IMG,/icons/picture.png) image/*
AddIconByType (SND,/icons/sound.png) audio/*
AddIconByType (VID,/icons/film.png) video/*
 
AddIcon /icons/application_double.png .exe
AddIcon /icons/application_xp_terminal.png .bin
AddIcon /icons/page_white_zip.png .Z .z .tgz .gz .zip
AddIcon /icons/page_white_code.png .shtml
AddIcon /icons/page_white_acrobat.png .pdf
AddIcon /icons/page_white_zip.png .txt
AddIcon /icons/page_white_c.png .c
AddIcon /icons/page_white_cplusplus.png .cpp
AddIcon /icons/page_white_dvd.png .dvi
AddIcon /icons/page_white_gear.png .ini .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/page_white_actionscript.png .as
AddIcon /icons/page_white_flash.png .fla .swf
AddIcon /icons/page_white_freehand.png .fh3 .fh4 .fh5 .fh7 .ft7 .fh8 .ft8 .fh9 .ft9 .fh10 .ft10 .fhx
AddIcon /icons/page_white_h.png .h
AddIcon /icons/page_white_php.png .php .php3 .php4 .php5
AddIcon /icons/page_white_office.png .docx .docm .dotx .dotm
AddIcon /icons/page_white_powerpoint.png .pptx .pptm .potx .potm .ppam .ppsx .ppsm
AddIcon /icons/page_excel.png .xlsx .xlsm .xltx .xltm .xlsb .xlam
AddIcon /icons/page_white_ruby.png .rb
AddIcon /icons/page_white_word.png .doc
AddIcon /icons/css.png .css
AddIcon /icons/html.png .html .htm
AddIcon /icons/xhtml.png .xhtml
AddIcon /icons/script_code.png .js
AddIcon /icons/database_table.png .sql
AddIcon /icons/script_gear.png .inc .pl .py
AddIcon /icons/help.png .chm
AddIcon /icons/music.png .wav .mp3 .ogg
 
AddIcon /icons/folder_delete.png ..
AddIcon /icons/asterisk_yellow.png README
AddIcon /icons/folder_add.png ^^DIRECTORY^^
AddIcon /icons/asterisk_orange.png ^^BLANKICON^^
 
DefaultIcon /icons/page_white.png

Все досить простенько, по порядку:

AliasMatch ^/icons(.*) /var/www/srv.if.ua/icons$1

це аліас модулем mod_alias для тих, в кого немає nginx;

AddIconByEncoding, AddIconByType, AddIcon, DefaultIcon

це директиви, які закріпляють значок за файлом згідно кодування, МІМЕ-типу, розширенню-масці і по дефолту відповідно. ^^DIRECTORY^^ – це каталог, ^^BLANKICON^^ – це значок в заголовку.

IndexOptions FancyIndexing IconsAreLinks XHTML HTMLTable  SuppressDescription

Тут перераховані опції: FancyIndexing – вивід іконок біля імен файлів; IconsAreLinks – іконки теж будуть клікабельні; XHTML – генерація XHTML замість HTML 3.2; HTMLTable – верстка таблицею замість блоку <pre></pre>; SuppressDescription – не виводити колонку “Description”. Детальніше для всіх директив, звісно, в описі mod_autoindex.

Хотілось би звернути увагу, що всі ці директиви загорнуті у <Directory /></Directory>, тобто для кореня кожного хоста.  Інакше не працюють, ні у випадку без секцій, ні коли ставив <Ifmodule mod_autoindex></Ifmodule>. Може, це лише особливість вищого рівня настройки, не знаю.

Після цього вказані іконки цілим пакетом silk залив в корінь головного хоста. Silk icons – дуже хороший і безкоштовний набір іконок для веб-дизайну в форматі png. Там 1000 значків. Залив усі, з цікавою перспективою – це буде віртуальний каталог, і з будь-якого хоста сервера, пославшись на іконку з цього каталогу, її можна використовувати, не інсталячи повторно. Зручно для шаблонів типу HTTP помилок, і взагалі.

Рис. 3. Вже видно іконки

Рис. 3. Вже видно іконки

Тепер ситуація трошки кращає (Рис. 3.), але не дуже, бо для інших хостів іконки не є віртуально доступні. Ну і розсипалось все.

Гм, всьо має бути рівненько. Apache має деякі проблеми з підрахунком довжини імен файлів кирилицею, що помітно з скриншота. Саме це спонукало використати опцію HTMLTable.

І, про що я ще не згадав, це можливість підключити файл зі стилями. Робиться просто

IndexStyleSheet /service/index.css

в самому файлі міститься джентльменський набір налаштунків, але їх в принципі вистачило. В каталог service поскладав всі обробники помилок, дефолтних сторінок, індексу от, і стилі до них.

body{
    padding:10px;
    font-size:14px;
    font-family:sans-serif;
}
 
h1{
    font-size:1.2em;
}
 
img{
    border:none;
}
 
table {
}
 
th, td{
    margin:0;
    padding:4px;
}
 
a{
    color:#002F3D;
}
a:hover{
    text-decoration:none;
}
Рис. 4. Прийнятний результат

Рис. 4. Прийнятний результат

Гммм, тепер взагалі добре стало, видно із рис. 4. Звісно, були інші варіанти, наприклад, зробити свій footer і  header, а шлях до каталогу підключати через SSI, але ІМХО, це не дуже потрібний екстремізм.

Нарешті, залишається зробити все вищеописане доступним для усіх хостів, які є на сервері. В файл server.conf nginx, який описаний тут (прочитати, в мене особлива конфігурація), слід дописати правила для двох каталогів.

location ~ /(icons|service)/ {
root /var/www/srv.if.ua;
access_log off;
expires 30d;
}

Отож, отримали симпатичний інтерфейс навігації, і здобули знання про багатогранний конструктор apache з світу open-source. Та й хочеться мати фірмовий стиль, як в хостинг-провайдерів, це просто хороший тон, такі наробки завжди знадобляться.

This entry was posted in GNU\Linux, Розробка web. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

You must be logged in to post a comment.