Основным, простейшим, но в то же время
чрезвычайно мощным инструментом поддержки больших наборов документов
является SSI (Server-Side Includes - включения на стороне сервера). Если
кто-то из вас знает Си, то он быстро поймет, что SSI чрезвычайно похож на
макроязык. С помощью SSI можно не только в зависимости от некоторых
условий выводить определенные части документа, не только формировать
документ из заранее определенных кусочков, но и вставлять результат работы
некоторого CGI сценария или программы прямо в документ.
Не смотря на порядок слов в заголовке (что, когда и как) мы сначала
расскажем "как", а потом уже перейдем к "когда".
В стандартном дистрибутиве Apache есть модуль mod_include. Начиная с
версии 1.2 он имеет расширенное количество директив и называется - XSSI
(eXtended SSI). По умолчанию он включен в компиляцию.
Включение механизма Server-Side Includes
Любой документ, у которого будет установлен обработчик "server-parsed"
будет сканироваться этим модулем, если включена опция "Includes". Если вы
имеете малое количество документов с SSI, то лучше всего в файле
httpd.conf указать следующее:
и устанавливать у таких файлов расширение .shtml. Если же все или почти
все документы будут иметь директивы SSI, то лучше в файле конфигурации
указать:
AddHandler server-parsed .html
И не забудьте включить в опции директории узла опцию Includes:
Options +Includes
Конечно в этой строке могут быть и другие нужные вам опции.
Базовые директивы
Директивы SSI включаются в HTML документ в виде комментариев (это не
мешает вам использовать обычные комментарии). Синтакс команд имеет
следующий вид:
Очень часто значение помещается в двойные кавычки. Некоторые команды
позволяют иметь только одну пару атрибут-значение. Обратите внимание, что
заключительная часть комментария (-->) должна отделяться от директивы
пробелом, иначе она будет воспринята, как ее часть.
Рассмотрим определенные в Apache элементы SSI:
config - контролирует различные аспекты сканирования. Его атрибутами
могут быть:
errmsg - устанавливает сообщение, выводящееся при возникновении ошибки;
в большинстве случаев целесообразно установить в пустую строку;
sizefmt - устанавливает формат, в котором будет выводиться размер
файла. Формат соответствует передаваемому библиотечной функции strftime;
timefmt - устанавливает формат, в котором будет выводиться дата.
echo - выводит значение установленной переменной SSI. Допустимым
атрибутом является var.
fsize - выводит размер файла в определенном с помощью sizefmt формате.
Допустимые атрибуты:
file - определяет путь к файлу, относительно сканируемого документа;
virtual - определяет стандартный кодированный URL, относительно
сканируемого документа, или, при наличии в начале слеша (/) - относительно
корня документов узла.
flastmod - выводит дату последней модификации файла в определенном с
помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.
include - включает текст другого документа или файла в сканируемый
файл. К включаемому файлу применяются все установленные правила
ограничения доступа. Если для каталога, из которого включается файл,
установлена опция IncludesNOEXEC, и включение данного документа привело бы
к запуску программы, то документ не включается, и выводится сообщение об
ошибке. CGI сценарии вызываются, как обычно с помощью URL, который может
содержать кодированную строку запроса (query string). Положение файла
указывается с помощью атрибутов:
file - указывает путь, относительно сканируемого документа; путь не
может содержать ../ и не может быть абсолютным путем; всегда
предпочтительнее использовать атрибут virtual;
virtual - содержит кодированный URL, относительный или абсолютный; URL
не может содержать имя протокола или имя хоста, и может содержать строку
запроса.
printenv - выводит содержимое переменных окружения. Вызывается без
параметров.
set - устанавливает значение переменной. Ее атрибутами являются var,
определяющий имя переменной, и value, определяющий ее значение.
Переменные включения
В дополнение к стандартным окружения CGI, модуль SSI делает доступными
для директив и условий, а также для вызываемых через SSI сценариев
следующие переменные:
DATE_GMT - текущее время по Гринвичу;
DATE_LOCAL - текущее локальное (для сервера) время;
DOCUMENT_NAME - имя файла (без каталогов) документа, запрошенного
пользователем;
LAST_MODIFIED - дата последней модификации документа, запрошенного
пользователем. То есть во вложенном SSI эта переменная будет содержать имя
"главного" документа, а не вложенного.
Подстановка переменных
Подстановка переменных производится внутри заключенных в кавычки строк
в большинстве аргументов SSI директив. В этих случаях знак доллара можно
вставить, предварив его слешом:
<!--#if expr="$a = \$test" -->
Для предотвращения двусмысленности можно заключать имя переменной в
фигурные скобки:
<!--#set var="Zed" value="${a}bc_${abc}" -->
В результате такого присвоения переменная Zed будет иметь значение
"Xbc_Y", если переменная a равна X, а переменная abc равна Y.
- истинно, если выполняется условие сравнения. Если string2 имеет форму
/string/, то тогда она интерпретируется, как регулятное выражение. Их
синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;
( test_condition ) - истинно, если test_condition истинно;
! test_condition - истинно, если test_condition ложно;
test_condition1 && test_condition2 - истинно, если как
test_condition1, так и test_condition2 истинны;
test_condition1 || test_condition2 - истинно, если хотя бы
test_condition1 или test_condition2 истинно.
"=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!"
имеет наивысший приоритет.
Все, что не распознается, как переменная, считается строкой. Если
строка имеет пробелы или символы табуляции, то ее надо заключать в
кавычки.
Практическое использование SSI
Первым распространенным применением SSI является внедрение в документ
некоего динамического куска разметки. Хрестоматийными примерами могут
служить счетчики посещений, цитаты или баннеры рекламных сетей. В любом
случае, будь то строка текста или целая таблица, вставка производится с
помощью директивы include, помещаемой в то место, куда должен быть
вставлен кусок разметки:
Программа или сценарий CGI, вставляемая с помощью SSI, ничем не
отличается от стандартной CGI программы, за исключением того, что должен
выдаваться не целый документ, а только кусок разметки.
Вторым распространенным применением SSI является формирование страницы
из шаблона. В простейшем случае - это документ в начало и конец которого
вставляются шапка и концевик:
Вставляемые блоки не обязательно должны быть законченными, например,
header.html может заканчиваться тэгом <td>, а global_menu.html или
footer.html начинаться с тэга </td>. Таким образом, какими бы
навороченными не были шапка и концевик документа, редактируемый документ
выглядит чрезвычайно просто, и его легко редактировать.
Только используя SSI вы можете в считанные минуты полностью изменить
внешний вид или обновить систему навигации на узле, имеющем сотни или
тысячи документов, и так, что это пройдет безболезненно для пользователей
узла, т.к. вам только потребуется заменить несколько файлов, а остальное
за вас сделает сервер.
В связи со всем вышесказанным рождается одно правило: желательно
смысловую часть документа строить так, чтобы она никак не полагалась на
содержимое шапок и концевиков. В этом случае вы легко сможете перейти с
табличной организации страниц на последовательную или на слоевую.
Теперь приведем пример файла, вставляемого в начало каждого документа
сервера http://www.citforum.ru/. Особенностью сервера является то, что
каждый раздел имеет свой базовый цвет, и все это создается этим
единственным файлом:
<font size="-1">Сервер содержит море(!) аналитической
информации</font></td>
<td align="right">
<font size="-1"><a
href="/rubricator/index.shtml">Рубрикатор всех документов CIT
Forum</a></font></td>
</tr>
</table>
</td></tr>
</table>
Данный пример иллюстрирует работу с условными операторами, с шаблонами,
а также возможность использования вложенных SSI.
Следующий пример иллюстрирует, как с помощью SSI собираются страницы в
Кладовой WebClub.ru. Их особенность заключается в наличии повторяющихся
блоков одинаково оформленного текста. Достигается это использованием трех
шаблонов:
_head.html
<html><head>
<title>Web Club Repository. <!--#echo var="TITLE"
--></title>
позволит вам создать цветовое перетекание в тексте любым цветом.
Достаточно
нажать несколько кнопок." -->
<!--#include virtual="_item.html" -->
<!--#include virtual="_foot.html" -->
Данный пример замечательно иллюстрирует передачу параметров вставляемым
файлам, возможность использования вложенного SSI, а также работу с
условными операторами. В случае, если потребуется изменить внешний вид
этих страниц, достаточно поменять всего три файла. Тут же весь раздел
приобретет новый вид. Или можно, отредактировав один единственный файл
отключить показ всех картинок в разделе.