Главные серверные включения и их атрибуты
Ниже приведен список основных серверных включений (SSI) и их атрибутов:- задает по умолчанию сообщение, которое передается при обнаружении ошибки во время синтаксического анализа документа.
<!-- #config errmsg = " Error: file not found " -->
SIZEFMT - устанавливает формат, используемый при отображении размера файла. Допустимы значения - bytes или abbrev, которое округляет размер до ближайшего килобайта.
<!-- #config sizefmt = " abbrev " -->- устанавливает формат для времени и даты. Подробнее об этом я расскажу ниже.
<!-- #config timefmt = " %A, %B, %e, %Y " -->- значением является имя переменной, которую надо напечатать.
<!-- #echo var = " DATE_GMT " -->- указывает относительный URL-путь к сценарию CGI:are visitor number <!-- #exec cgi = " /cgi-bin/counter.pl " -->
CMD - задает любую команду на сервере. Переменные SSI доступны этой команде.
<!-- #exec cmd = " bin/finger $REMOTE_USER@$REMOTE_HOST " -->
FSIZE- задает месторасположение файла в виде пут, относительно каталога, в котором находится анализируемый документ.- задает путь url относительно текущего анализируемого документа. Если он не начинается со слэша (/), то считается относящимся к текущему документу.
The size of this file is <!-- #fsize file = " somefile.html " -->- задает месторасположение файла в виде пути, относительно каталога, в котором находится анализируемый документ.- задает путь url относительно текущего анализируемого документа. URL не может содержать схему или имя хоста, только путь. Если он не начинается со слэша (/), то считается относящимся к текущему документу.
This file was last modified on <!-- #flastmode virtual = " /mydocs/somefile.html " -->
INCLUDE- задает месторасположение файла в виде пути, относительно каталога, в котором находится анализируемый документ. То есть он не может содержать ../ или быть абсолютным. Предпочтение всегда следует отдавать атрибуту virtual.- задает путь url относительно анализируемого документа. URL не должен содержать схему или имя хоста. Если он не начинается со слеша (/), то считается относящимся к текущему документу.
<!-- #include virtual = " somefile.html " -->- используется только Apache версии 1.2 и выше. Элемент распечатывает список всех существующих переменных и их значения.
<!-- #ptintenv -->- имя устанавливаемой переменной.- значение, присваиваемое переменной.
<!-- #set var = " password " value = " mustard " -->
2. Механизм SSI
.1 Включение механизма Server-Side Includes
Любой документ, у которого будет установлен обработчик "server-parsed" будет сканироваться этим модулем, если включена опция "Includes". Если вы имеете малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующее:
AddType text/html .shtml AddHandler server-parsed .shtml
и устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в файле конфигурации указать:server-parsed .html
И не забудьте включить в опции директории узла опцию Includes:+Includes
Конечно, в этой строке могут быть и другие нужные вам опции.
.2 Базовые директивы
Директивы SSI включаются в HTML документ в виде комментариев (это не мешает вам использовать обычные комментарии). Синтаксис команд имеет следующий вид:
<!--#element attribute=value attribute=value ... -->
Очень часто значение помещается в двойные кавычки. Некоторые команды позволяют иметь только одну пару атрибут-значение. Обратите внимание, что заключительная часть комментария (-->) должна отделяться от директивы пробелом, иначе она будет воспринята, как ее часть.
Рассмотрим определенные в Apache элементы SSI:- контролирует различные аспекты сканирования. Его атрибутами могут быть:- устанавливает сообщение, выводящееся при возникновении ошибки; в большинстве случаев целесообразно установить в пустую строку;- устанавливает формат, в котором будет выводиться размер файла. Формат соответствует передаваемой библиотечной функции strftime;- устанавливает формат, в котором будет выводиться дата.- выводит значение установленной переменной SSI. Допустимым атрибутом является var.- выводит размер файла в определенном с помощью sizefmt формате.
Допустимые атрибуты:- определяет путь к файлу, относительно сканируемого документа;- определяет стандартный кодированный URL, относительно сканируемого документа, или, при наличии в начале слеша (/) - относительно корня документов узла.- выводит дату последней модификации файла в определенном с помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.- включает текст другого документа или файла в сканируемый файл. К включаемому файлу применяются все установленные правила ограничения доступа. Если для каталога, из которого включается файл, установлена опция IncludesNOEXEC, и включение данного документа привело бы к запуску программы, то документ не включается, и выводится сообщение об ошибке. CGI сценарии вызываются, как обычно с помощью URL, который может содержать кодированную строку запроса (query string). Положение файла указывается с помощью атрибутов:- указывает путь, относительно сканируемого документа; путь не может содержать ../ и не может быть абсолютным путем; всегда предпочтительнее использовать атрибут virtual;- содержит кодированный URL, относительный или абсолютный; URL не может содержать имя протокола или имя хоста, и может содержать строку запроса.- выводит содержимое переменных окружения. Вызывается без параметров.- устанавливает значение переменной. Ее атрибутами являются var, определяющий имя переменной, и value, определяющий ее значение.
.3 Переменные включения
В дополнение к стандартным окружениям CGI, модуль SSI делает доступными для директив и условий, а также для вызываемых через SSI сценариев следующие переменные:_GMT - текущее время по Гринвичу;_LOCAL - текущее локальное (для сервера) время;_NAME - имя файла (без каталогов) документа, запрошенного пользователем;_URI - декодированный URL запрошенного пользователем документа;_MODIFIED - дата последней модификации документа, запрошенного пользователем. То есть во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.
.4 Подстановка переменных
Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI директив. В этих случаях знак доллара можно вставить, предварив его слешем:
<!--#if expr="$a = \$test" -->
Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:
<!--#set var="Zed" value="${a}bc_${abc}" -->
В результате такого присвоения переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.
.5 Условные операторы
Базовыми элементами контроля являются:
<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->
Элементы elif и else являются необязательными.
Элемент endif заканчивает элемент if и является обязательным._condition может быть одним из следующих:
string - истинно, если string не пуста;
string1 = string2!= string2< string2<= string2> string2>= string2
- истинно, если выполняется условие сравнения. Если string2 имеет форму /string/, то тогда она интерпретируется, как регулярное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;
( test_condition ) - истинно, если test_condition истинно;
"=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!" имеет наивысший приоритет.
Все, что не распознается, как переменная, считается строкой. Если строка имеет пробелы или символы табуляции, то ее надо заключать в кавычки.
3. Практическое использование SSI
.1 Добавление разметки
Наиболее распространенным применением 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"};"Content-type: text/html\n\n";
($IP)=($ENV{"REMOTE_ADDR"}=~s/\.//g);($$+$IP+time);
$seed=int rand(10000000);"<a href=\"#"justify">Как видно из примера даже во включаемых сценариях необходимо выводить HTTP заголовок.
В результате сканирования нашего простейшего документа пользователю будет возвращен примерно (с точностью до случайной величины) следующий документ:
<html>
<body>
<p>Документ с баннером внизу страницы</p>
<a href="#"justify"><img src="#"justify"></a>
</body>
</html>
.2 Формирование страницы из шаблона
Вторым распространенным применением 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>. Таким образом, какими бы навороченными не были шапка и концовка документа, редактируемый документ выглядит чрезвычайно просто, и его легко редактировать.
В связи со всем вышесказанным рождается одно правило: желательно смысловую часть документа строить так, чтобы она никак не полагалась на содержимое шапок и концовок. В этом случае вы легко сможете перейти с табличной организации страниц на последовательную или на слоевую.
.3 Пример начального файла сервера
Далее приведен пример файла, вставляемого в начало каждого документа сервера <#"justify">1.Нильсен Якоб. Веб-дизайн, 2006.
2.Спейнауэр С., Экштейн Р. Справочник веб-мастера (2-е издание). - СПб.: Символ-Плюс, 2000.
3.Хилайер. С; Мизик Д. Программирование Active Server Pages, 1999.
.Джесси Рассел, Рональд Кон.SSI(Программирование).
5.Мейер Э.А. CSS-каскадные таблицы стилей. Подробное руководство,2008.
6.Джон Дакетт <#"justify">Приложение 1
<link rel=stylesheet type="text/css" href="/css/cf.css">
</head>
<!--#if expr="$DOCUMENT_URI=/\/internet\//" -->
<body bgcolor="#FFFFFF" link="#099771" vlink="#006741" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header2.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/database\//" -->
<body bgcolor="#FFFFFF" link="#719709" vlink="#416700" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header3.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/ofis\//" -->
<body bgcolor="#FFFFFF" link="#98650A" vlink="#683500" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header4.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/abtec\//" -->
<body bgcolor="#FFFFFF" link="#98340A" vlink="#680400" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header5.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/programming\//" -->
<body bgcolor="#FFFFFF" link="#099607" vlink="#006600" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header6.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/operating_systems\//" -->
<!--#elif expr="$DOCUMENT_URI=/\/abtec\//" -->
<body bgcolor="#FFFFFF" link="#98340A" vlink="#680400" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header5.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/ftp\//" -->
<body bgcolor="#FFFFFF" link="#970941" vlink="#670011" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<body bgcolor="#FFFFFF" link="#970941" vlink="#670011" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/finnews\//" -->
<body bgcolor="#FFFFFF" link="#970941" vlink="#670011" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/events\//" -->
<body bgcolor="#FFFFFF" link="#970941" vlink="#670011" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/lists\//" -->
<body bgcolor="#FFFFFF" link="#970941" vlink="#670011" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header8.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/hardware\//" -->
<body bgcolor="#FFFFFF" link="#950995" vlink="#650065" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header9.jpg" width="100%">
<!--#elif expr="$DOCUMENT_URI=/\/nets\//" -->
<body bgcolor="#FFFFFF" link="#390A98" vlink="#090068" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header10.jpg" width="100%">
<!--#else -->
<body bgcolor="#FFFFFF" link="#006890" vlink="#003860" alink="#800000" text="#000000">
<table cellspacing=0 cellpadding=0 border=0 background="/pictures/menu/header0.jpg" width="100%">
<!--#endif -->
<tr><td align="center">
<table cellspacing=0 cellpadding=4 border=0 width="100%" background="">
<tr><td align="left">
<img src="/pictures/menu/logo.gif" height=53 border=0 alt="Server for Information Technologies">
</td><td align="right">
<!--#include virtual="/cgi-bin/Look_new.cgi"-->
</td></tr>
</table>
<table cellspacing=0 cellpadding=4 border=0 width="100%" background="">
<tr valign=top><td align="left">
<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>
Приложение 2
_head.html
<html><head>
<title>Web Club Repository. <!--#echo var="TITLE" --></title>
<meta http-equiv="Content-Type" content="text/html">
<meta http-equiv="author" content="Andrey G. Novikov + Andrew Yourtchenko">
<meta http-equiv="distribution" content="global">
<meta http-equiv="resource-type" content="document">
<meta name="keywords" content="WebClub, <!--#echo var="KEYWORDS" -->">
<meta name="description" content="WebClub. Кладовая. <!--#echo var="DESCRIPTION" -->">
<link rel="stylesheet" type="text/css" href="/webclub2.css">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000A8" vlink="#000040" alink="#FF0000">
<h1 align="center"><font color="#CCCCCC"><h></font>КЛАДОВАЯ<font color="#CCCCCC"></h></font><br>
<img src="/images/bar.gif" height=19 border=0></h1>
<h2 align="center"><!--#echo var="TITLE" --></h2>
_item.html
<table cellspacing=0 cellpadding=3 border=0 width="100%"><tr><td bgcolor="#CCCCFF">
<b><!--#echo var="I_TITLE" --></b>
</td></tr></table>
<!--#if expr="$I_PIC" -->
<br>
<table cellspacing=1 cellpadding=3 border=1 align="right" bgcolor="#CCCCFF">
<tr><td align="center" valign="middle">
<img src="<!--#echo var="I_PIC" -->" width="<!--#echo var="I_PIC_W" -->"="<!--#echo var="I_PIC_H" -->" border=0>
</td></tr></table>
<!--#endif -->
<p>
<!--#if expr="$I_SITE" -->
<b>Узел поддержки</b>:<a href="<!--#echo var="I_SITE" -->"><!--#echo var="I_SITE" --></a><br>
<!--#endif -->
<b>Домашняя страница</b>:<a href="<!--#echo var="I_PAGE" -->"><!--#echo var="I_PAGE" --></a><br>
<!--#endif -->
<!--#if expr="$I_ARCHIVE" -->
<b>Она сама</b>:<a href="<!--#echo var="I_ARCHIVE" -->"><!--#echo var="I_ARCHIVE" --></a><br>
<!--#endif -->
<!--#if expr="$I_LOCALARCHIVE" -->
<b>Она сама у нас</b>: <a href="<!--#echo var="I_LOCALARCHIVE" -->"><!--#echo var="I_LOCALARCHIVE" --></a><br>
<!--#endif -->
<!--#if expr="$I_PLATFORM" -->
<b>Платформа</b>: <!--#echo var="I_PLATFORM" --><br>
<!--#endif -->
<!--#if expr="$I_STATUS" -->
<b>Статус</b>: <!--#echo var="I_STATUS" --><br>
<!--#endif -->
</p>
<p align="justify">
<!--#if expr="$I_DESCRIPTION" -->
<!--#echo var="I_DESCRIPTION" -->
<!--#else -->description.
<!--#endif -->
</p>
<br clear="right"><br>
_foot.html
<!--#include virtual="/materials/banfooter.html"-->
</body>
</html>