Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

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

Основным, простейшим, но в то же время чрезвычайно мощным инструментом поддержки больших наборов документов является SSI (Server-Side Includes - включения на стороне сервера). Если кто-то из вас знает Си, то он быстро поймет, что SSI чрезвычайно похож на макроязык. С помощью SSI можно не только в зависимости от некоторых условий выводить определенные части документа, не только формировать документ из заранее определенных кусочков, но и вставлять результат работы некоторого CGI сценария или программы прямо в документ.

Не смотря на порядок слов в заголовке (что, когда и как) мы сначала расскажем "как", а потом уже перейдем к "когда".

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

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

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

<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%"> <!--#elif expr="$DOCUMENT_URI=//news//" --> <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" width=157 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>

Данный пример иллюстрирует работу с условными операторами, с шаблонами, а также возможность использования вложенных SSI.

Их особенность заключается в наличии повторяющихся блоков одинаково оформленного текста. Достигается это использованием трех шаблонов:

_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">&lt;h&gt;</font>
КЛАДОВАЯ<font color="#CCCCCC">&lt;/h&gt;</font><br> <img src="/images/bar.gif" width=587 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" -->" height="<!--#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 --> <!--#if expr="$I_PAGE" --> <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 --> No description. <!--#endif --> </p> <br clear="right"><br>

_foot.html

<!--#include virtual="/materials/banfooter.html"--> </body> </html>

А вот как выглядит на самом деле файл, который вы воспринимаете, как обычный HTML документ (он сокращен для удобства восприятия):

<!--#set var="TITLE" value="HTML редакторы и утилиты" --> <!--#set var="KEYWORDS"
value="HTML,editor,редактор,утилита,utilities,freeware,
shareware,free" --> <!--#set var="DESCRIPTION" value="HTML редакторы и утилиты" --> <!--#include virtual="_head.html" --> <!--#set var="I_TITLE" value="Prime Style 1.2" --> <!--#set var="I_RATING" value="1" --> <!--#set var="I_PIC" value="ps.gif" --> <!--#set var="I_PIC_W" value="300" --> <!--#set var="I_PIC_H" value="225" --> <!--#set var="I_SITE" value="" --> <!--#set var="I_PAGE" value="http://www.northnet.com.au/
~hardy/prime/" --> <!--#set var="I_ARCHIVE" value="" --> <!--#set var="I_LOCALARCHIVE" value="" --> <!--#set var="I_PLATFORM" value="Windows 95/NT" --> <!--#set var="I_STATUS" value="Free" --> <!--#set var="I_DESCRIPTION" value="Простой и наглядный редактор
каскадных стилей. Простой и понятный интерфейс." --> <!--#include virtual="_item.html" --> <!--#set var="I_TITLE" value="Web-O-Rama v.4.00" --> <!--#set var="I_RATING" value="" --> <!--#set var="I_PIC" value="weborama.gif" --> <!--#set var="I_PIC_W" value="300" --> <!--#set var="I_PIC_H" value="225" --> <!--#set var="I_SITE" value="" --> <!--#set var="I_PAGE" value="" --> <!--#set var="I_ARCHIVE" value="" --> <!--#set var="I_LOCALARCHIVE" value="" --> <!--#set var="I_PLATFORM" value="Windows 95/NT" --> <!--#set var="I_STATUS" value="Free" --> <!--#set var="I_DESCRIPTION" value="Весьма удобный интерфейс,
возможность внешнего просмотра файлов через браузер, открывает сразу много файлов. Есть встроенный индикатор контроля системных ресурсов." --> <!--#include virtual="_item.html" --> <!--#set var="I_TITLE" value="HTML Font Colorizer" --> <!--#set var="I_RATING" value="3" --> <!--#set var="I_PIC" value="" --> <!--#set var="I_PIC_W" value="100" --> <!--#set var="I_PIC_H" value="100" --> <!--#set var="I_SITE" value="" --> <!--#set var="I_PAGE" value="http://home1.inet.tele.dk/
theill/hfc.htm" --> <!--#set var="I_ARCHIVE" value="" --> <!--#set var="I_LOCALARCHIVE" value="" --> <!--#set var="I_PLATFORM" value="Windows 95/NT" --> <!--#set var="I_STATUS" value="Freeware" --> <!--#set var="I_DESCRIPTION" value="Эта великолепная утилита, котороя позволит вам создать цветовое перетекание в тексте любым цветом.
Достаточно нажать несколько кнопок." --> <!--#include virtual="_item.html" --> <!--#include virtual="_foot.html" -->


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте