Server-Side Include


Идея

   Один из недостатков HTML - это то, что сам по себе он неизменен. Он пребывает и на сервере и у клиента в том самом виде, каким его создал автор. Попыток решить эту проблему много. Но сейчас мы рассмотрим только одно из решений - технологию SSI (Server-Side Include).

   Сущность этого метода заключается в следующем: в файл HTML, хранящийся на сервере включаются СПЕЦИАЛЬНЫЕ НЕ HTML комманды. Сервер, получив запрос на этот файл, просматривает его содержимое и находя одну из этих КОММАНД, выполняет определенные действия. В результате этих ДЕЙСТВИЙ файл HTML ИЗМЕНЯЕТСЯ и в измененном виде ОТПРАВЛЯЕТСЯ клиенту. Сам файл хранящийся на сервере НЕ ИЗМЕНЯЕТСЯ.

Этап I. Включение поддержки SSI HTTP-Сервером

   Естественно, если Вы собираетесь использовать SSI, вы должны убедиться , что она работает на том сервере, где Вы будете размещать страницу. SSI поддерживают вероятно все HTTP-серверы для всех(?) платформ. Другой вопрос - включена ли эта функция на данном сервере. Так например для включения SSI на столь популярном HTTP-Сервер, как Apache (под UNIX,Win9x,WinNT можно взять на www.apache.org) необходимо внести в файл конфигурации следующие строки:

AddType text/html .shtml
AddHandler server-parsed .shtml

Кроме того для описания тех директорий в которых у Вас находятся .SHTML файлы Вы должны не забыть указать Options +Includes.

   Для других HTTP-серверов методы включения скорее всего другие (Если знаете как включать SSI под другими популярными HTTP-Серверами пишите).

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

Этап II. Комманды SSI

   Любая комманда SSI имеет один и тот же синтаксис:

<!--#command attribute=value attribute=value ... attribute=value -->

Если присмотреться то можно легко заметить, что сама комманда заключена в пару тагов HTML <!-- --> обозначающих комментарий. Это гарантирует, что если Сервер не поддерживает SSI эта комманда все же не появится на экране броузера клиента.

   ВНИМАНИЕ! между последним значением и тагом --> должен быть ПРОБЕЛ. Иначе Вы можете неделю искать ошибку и не находить.

Итак, комманды, которые SSI понимает HTTP-Сервер: config,echo,exec,fsize,flasmod,include,printenv,set.

Include

   Я начну описание комманд не по порядку, так как считаю эту команду одной из самых полезных и простых. Эта комманда применяется для того, чтобы вставить в HTML файл другой файл.

Синтаксис комманды:

<!--#include file="относительный путь к файлу на диске" -->, или
<!--#include virtual="относительный URL файла" -->

NB! В случае использования file Вы не можете использовать /.. или абсолютный путь. Например:

Файл index.shtml на сервере
<html>
<head><title>Изучаем команду include SSI</title></head>
<body>
<!--#include virtual="content.shtml" -->
</body>

Файл content.shtml на сервере
<H1>Привет Мир!</H1>

Файл index.shtml который получит клиент
<html>
<head><title>Изучаем команду include SSI</title></head>
<body>
<H1>Привет Мир!</H1> </body>

Exec

   Эта комманда выполняет файл CGI или под UNIX любую комманду с использованием /bin/sh. Результат исполнения - некая информация вставляемая в исходный HTML файл на место этой комманды. Вставляемая информация может быть двух типов. Это или результат выполнения CGI или, если CGI скрипт вернул ссылку на файл, то в исходный HTML вставляется ссылка <a href=...> на этот файл. (См. CGI (Common Gateway Interface))

Синтаксис комманды:

<!--#include cgi="относительный URL CGI-приложения" -->, или
<!--#include cmd="комманда, которую надо исполнить" -->

NB! CGI-приложению передается в качестве параметра та информация, которая была передана странице. Поэтому Вы не можете указывать в URL команды параметры скрипту. Кроме того, если URL начинается с '/' то будет воспринят как абсолютный путь от корня.

Flastmod

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

Синтаксис комманды:

<!--#flastmod file="относительный путь к файлу на диске" -->, или
<!--#flastmod virtual="относительный URL файла" -->

NB! Для вывода даты последнего изменения той страницы, которая содержит комманду надо использовать не flastmod, а echo см. ниже.

Fsize

   Комманда, аналогичная предыдущей - дает Вам возможность выводить размер какого-либо файла. То есть, сервер смотрит размер файла и вставляет его в вашу страницу.

Синтаксис комманды:

<!--#fsize file="относительный путь к файлу на диске" -->, или
<!--#fsize virtual="относительный URL файла" -->

config

   Если Вы начнете использовать комманды flastmod и fsize Вы сразу столкнетесь с одной небольшой неприятностью: они вставляют размер и дату СОВЕРШЕННО не в том виде, о котором Вы думали. Для того, чтобы совместить желаемое и действительное нужно использовать комманду config:

Синтаксис комманды:

<!--#config errmsg="текст сообщения, которое надо отправить клиенту, если во время обработки этого файла появилась ошибка" sizefmt="Формат вывода размеров" timefmt="Формат вывода даты" -->

Теперь подробнее о параметрах sizefmt и timefmt:

sizefmt в качестве аттрибута воспринимает три варианта: "bytes","Kb","Mb". Я думаю, что объяснять значение этих форматов не надо :)

С коммандой timefmt все несколько сложнее. В качестве параметра она воспринимает строку. Эта строка содержит в себе текст и переменные. Например: "%d/%m/%Y". Здесь текст - это знаки '/', а переменные - %d,%m.%Y - они будут заменены на день, число и год (из 4 цифр) соответственно. Превратится на выходе в классическое представление даты: дд/мм/гггг.

echo

   Эта комманда позволяет вставить в страницу одну из "встроенных переменных". Встроенные переменные это переменные которые существуют и имеют значение независимо от того, используете Вы их или нет. Основные из встроенных переменных:

DATE_GMT - Текущая дата/время формата GMT

DATE_LOCAL - Местная дата/время

DOCUMENT_NAME - имя файла, запрошенного пользователем

DOCUMENT_URL - путь URL к файлу, запрошенному пользователем

LAST_MODIFIED - дата/время последнего изменения файла запрошенного пользователем

Синтаксис комманды:

<!--#echo var="имя встроенной переменной" -->

Например:

Файл index.shtml
<html>
.
.
.
<body>
Эта страница последний раз была изменена: <!--#echo var="LAST_MODIFIED" -->
<br>
<H1>Новость дня</H1>
.
.
.
</body>
</html>

NB! Обратите внимание, что формат вывода даты/времени определен коммандой config

Этап III. И зачем все это надо

   Итак. Зачем необходима технология SSI. Самое малое - с ее помощью можно вставить дату последнего изменения страницы. Очень полезно и любимо людьми. Во вторых, что просто бесценно - можно разделить дизайн сайта и содержимое. То есть: Почти весь современный дизайн делается в виде таблицы. От страницы к странице меняется одна - две - три -пять :) ячеек. Если мы вырежем неизменяемую часть в отдельные файлы, то сможем создавать страницы типа:

Файл index.shtml
<!--#config timefmt="%d/%m/%Y" -->
<!--#include virtual="header.shtml" -->
<!--#include virtual="top.shtml" -->
Новость дня
Сегодня во время путешествия в России был зверзки растерзан любимец толпы Леонардо Ди Каприо. :)
<!--#include virtual="content-design.shtml" -->
Этот сайт является официальным представительством ...
<!--#include virtual="footer.shtml" -->

Сотни и сотни других способов применения технологии Server Side Include предстоит придумать Вам!



Главная страница