SSI

Автор: Topol Воскресенье, Апрель 15th, 2012 Нет комментариев

Рубрика: Программирование

Обзор SSI

Директивы 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 вы можете в считанные минуты полностью изменить внешний вид или обновить систему навигации на узле, имеющем сотни или тысячи документов, и так, что это пройдет безболезненно для пользователей узла, т.к. вам только потребуется заменить несколько файлов, а остальное за вас сделает сервер.

В связи со всем вышесказанным рождается одно правило: желательно смысловую часть документа строить так, чтобы она никак не полагалась на содержимое шапок и концевиков. В этом случае вы легко сможете перейти с табличной организации страниц на последовательную или на слоевую.

Источник: webcorp.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты