SSI - что, когда, как?

Может быть, вы хотите сделать такой сайт, в котором в зависимости от некоторых условий будут выводиться определенные части документа. Или сам документ будет формироваться из заранее определенных кусочков? А, может, вам необходимо вставлять результат работы некоторого CGI-сценария или программы прямо в документ? Тогда вам просто необходимо применять при разработке своего сайта технологию SSI (Server-Side Includes).

Если кто-то из вас знает Си, то он быстро поймет, что SSI чрезвычайно похож на макроязык.
В стандартном дистрибутиве Apache есть модуль mod_include. Начиная с версии 1.2 он имеет расширенное количество директив и называется XSSI (eXtended SSI). По умолчанию он включен в компиляцию.

Включение механизма Server-Side Includes
Любой документ, у которого будет установлен обработчик "server-parsed", будет сканироваться этим модулем, если включена опция "Includes". Если вы имеете малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующее:
AddType text/html.shtml
AddHandler server-parsed.shtml
и устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в файле конфигурации указать:
AddHandler server-parsed.html
И не забудьте включить в опции директории узла опцию Includes:
Options +Includes
Конечно, в этой строке могут быть и другие нужные вам опции.

Базовые директивы
Директивы SSI включаются в HTML-документ в виде комментариев (это не мешает вам использовать обычные комментарии). Синтаксис команд имеет следующий вид:
<!--#element attribute=value attribute=value... -->
Очень часто значение помещается в двойные кавычки. Некоторые команды позволяют иметь только одну пару атрибут-значение. Обратите внимание, что заключительная часть комментария (-> ) должна отделяться от директивы пробелом, иначе она будет воспринята как ее часть.

Рассмотрим определенные в 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 - имя файла (без каталогов) документа, запрошенного пользователем;
DOCUMENT_URI - декодированный URL запрошенного пользователем документа;
LAST_MODIFIED - дата последней модификации документа, запрошенного пользователем. То есть во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.

Подстановка переменных
Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI-директив. В этих случаях знак доллара можно вставить, предварив его слешем:
<!--#if expr="$a = \$test" -->
Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:
<!--#set var="Zed" value="${a}bc_${abc}" -->
В результате такого присвоения переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.

Условные операторы
Базовыми элементами контроля являются:
<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

Элементы elif и else являются необязательными.
Элемент endif заканчивает элемент if и является обязательным.
test_condition может быть одним из следующих:
string - истинно, если string не пуста;
string1 = string2
string1!= string2
string1 string1 <= string2
string1> string2
string1 > = string2 - истинно, если выполняется условие сравнения. Если 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, знаний, полученных в этой статье, вам должно вполне хватить, чтобы попробовать на своем опыте эту технологию. Я уверен, что при разработке многих серьезных сайтов вам она не раз пригодится.

По материалам www.webclub.ru Подготовил к печати Левшунов Глеб


Компьютерная газета. Статья была опубликована в номере 09 за 2000 год в рубрике интернет :: вебмастеру

©1997-2024 Компьютерная газета