Базовые директивы
Директивы SSI включаются в HTML документ в виде комментариев (это не мешает
вам использовать обычные комментарии). Синтаксис команд имеет следующий вид:
<!--#element attribute=value attribute=value ... -->
Зачастую
значение помещается в двойные кавычки. Некоторые команды позволяют иметь только
одну пару атрибут-значение. Обратите внимание, что заключительная часть
комментария (-->) должна отделяться от директивы пробелом, иначе она будет
воспринята, как ее часть.
Элементы SSI:
config - контролирует различные аспекты сканирования. Его атрибутами могут
быть:
- errmsg - устанавливает сообщение, выводящееся при возникновении ошибки; в
большинстве случаев целесообразно установить в пустую строку;
- sizefmt - устанавливает формат, в котором будет выводиться размер файла.
Формат соответствует передаваемому библиотечной функции strftime;
- timefmt - устанавливает формат, в котором будет выводиться дата.
echo - выводит значение установленной переменной SSI. Допустимым атрибутом
является var.
fsize - выводит размер файла в определенном с помощью sizefmt формате.
Допустимые атрибуты:
- file - определяет путь к файлу, относительно сканируемого документа;
- virtual - определяет стандартный кодированный URL, относительно
сканируемого документа, или, при наличии в начале слеша (/) - относительно
корня документов узла.
flastmod - выводит дату последней модификации файла в определенном с помощью
timefmt формате. Атрибуты аналогичны атрибутам fsize.
include - включает текст другого документа или файла в сканируемый файл. К
включаемому файлу применяются все установленные правила ограничения доступа.
Если в каталоге, из которого включается файл, нельзя запускать серверные
сценарии, и включение данного документа привело бы к запуску программы, то
документ не включается, и выводится сообщение об ошибке. 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 < string2
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
Самым распространенным применением SSI является внедрение в документ некоего
динамического куска разметки. Наиболее типичными примерами могут служить
счетчики посещений, цитаты или баннеры рекламных сетей. В любом случае, будь то
строка текста или целая таблица, вставка производится с помощью директивы
include, помещаемой в то место, куда должен быть вставлен кусок разметки:
<html>
<body>
<p>Документ с баннером внизу
страницы</p>
<!--#include virtual="/cgi-bin/ibanner.pl?webclub"
-->
</body>
</html>
Программа или сценарий CGI, вставляемая с помощью SSI, ничем не отличается от
стандартной CGI программы, за исключением того, что должен выдаваться не целый
документ, а только кусок разметки.
Вот текст упомянутого выше сценария:
#!/usr/local/bin/perl
$login=$ENV{"QUERY_STRING"};
print "Content-type:
text/html/n/n";
($IP)=($ENV{"REMOTE_ADDR"}=~s//.//g);
srand($$+$IP+time);
$seed=int
rand(10000000);
print "<a
href=/"http://www.reklama.ru/cgi-bin/href/$login?$seed/">/n";
print
"<img src=/"http://www.reklama.ru/cgi-bin/banner/$login?$seed/" width=468
height=60 border=0>/n";
print "</a>/n";
Как видно из примера даже во включаемых сценариях необходимо выводить HTTP
заголовок.
В результате сканирования нашего простейшего документа пользователю будет
возвращен примерно (с точностью до случайной величины) следующий документ:
<html>
<body>
<p>Документ с баннером внизу
страницы</p>
<a
href="http://www.reklama.ru/cgi-bin/href/webclub?348593">
<img
src="http://www.reklama.ru/cgi-bin/banner/webclub?348593" width=468 height=60
border=0>
</a>
</body>
</html>
Другим применением SSI является формирование страницы из шаблона. В
простейшем случае - это документ в начало и конец которого вставляются шапка и
концевик:
<html>
<head>
<title>Test
Page</title>
</head>
<!--#include
virtual="/ssi/header.html" -->
<h1>Тестовая
страница</h1>
<p>Некий текст</p>
<!--#include
virtual="/ssi/global_menu.html" -->
<!--#include
virtual="/ssi/footer.html" -->
</body>
</html>
Вставляемые блоки не обязательно должны быть законченными, например,
header.html может заканчиваться тэгом <td>, а global_menu.html или
footer.html начинаться с тэга </td>. Таким образом, какими бы
навороченными не были шапка и концевик документа, редактируемый документ
выглядит чрезвычайно просто, и его легко редактировать.
Только используя SSI вы можете в считанные минуты полностью изменить внешний
вид или обновить систему навигации на узле, имеющем сотни или тысячи документов,
и так, что это пройдет безболезненно для пользователей узла, т.к. вам только
потребуется заменить несколько файлов, а остальное за вас сделает сервер.
В связи со всем вышесказанным рождается одно правило: желательно смысловую
часть документа строить так, чтобы она никак не полагалась на содержимое шапок и
концевиков. В этом случае вы легко сможете перейти с табличной организации
страниц на последовательную или на слоевую.
(c) WebClub