» Hardware » Software » Windows » Internet » Humor » Other

SSI

Argon On-Line » Internet » Webmastering
 

На сегодняшний день мы с вами в очередной раз можем стать свидетелями очередного довольно значительного "наворота" в развитии технологии отображения веб-страниц на экранах наших мониторов. Вот только подобное дополнение теперь создано не для конкретно самого броузера, а для сервера, где, собственно говоря, и хранятся впоследствии отображаемые файлы htm, html, js и т.д. Хотя, учитывая характер его применения, поистине странно, почему авторы до сих пор не предложили включить свое творение в стандарт html, вероятно, здесь проблемы не столько у программистов, сколько у тех, кто им назначает зарплаты.

Что это такое?

Технология эта носит гордое название, как всегда, из трех букв — SSI. Насчет "как всегда" не подумайте ничего дурного, ведь в действительности так и есть, что ни возьми все по стандарту: css, cgi, www. Но давайте не будем строить предположения о причинах такого положения вещей, — скорее всего, просто так удобней. К тому же, основная общность всех этих названий состоит в том, что все они являются, по субъективно-объективному мнению многих, "наворотами" над почти полностью исчерпавшей себя и к настоящему моменту уже непригодной технологии HTML. Последнее предложение, отмечу еще раз, является мнением далеко не всех, но многих.

В действительности, Интернет уже просто устал от невероятного количества подобных наворотов, которые появляются, считай, каждый месяц, и, как правило, либо упрощают сложные, но ставшие обычными вещи, либо просто имитируют действия друг друга с оглядкой на приорететы фирмы, их создавшей. Касается это, в основном, конкуренции между броузерами и, соответственно, интерпретаторами различных кодов, написанными под них. Если, к примеру, взять спецификацию HTML 4, так просто удивляешься, как далеко тот же Microsoft Internet Explorer от нее, так сказать, продвинулся вперед. Те же легендарные ActiveX и Vbscript для своего описания требуют уже не просто отдельных книг, а целых библиотек сугубо научной литературы.

А вот представим себе, что фирма Microsoft прекратила выпуск своих броузеров (конечно, вероятность такого поворота событий, мягко говоря, невелика, но все же никто не застрахован от неожиданных приятных случайностей). И куда же, в таком случае девать всю эту огромную кипу никому не нужной бумаги?… Правильно… Но все же обидно, что такие замечательные вещи, разрабатываемые столь же замечательными людьми на протяжении не одного месяца, а может даже и года, уйдут в глубины истории из-за того, что несколько фирм не смогли друг с другом договориться об общепринятых стандартах.

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

Как это выглядит?

SSI расшифровывается как Server-Side Includes, что примерно переводится как "Включения на стороне сервера". Изначально разрабатывались они как дополнения к CGI-скриптам (программам, управляющим отображением документа с сервера, не загружаясь при этом к промотрщику на винчестер), однако в дальнейшем были преобразованы в очередную новую технологию, расширяющую возможности html. На самом деле, появления чего-то подобного ожидали уже довольно давно, однако предполагалось, что это нечто будет включено непосредственно в html и, соответственно, будет выглядеть наподобие таблиц стилей CSS либо станет дополнением к Javascript, но почти никто не думал, что все это будет являться совершенно отдельным образованием. Почему сделали именно так, как сделали, лично для меня загадка.

Новая технология практически никак не интегрируется ни с чем старым, при этом, конечно, давая какие-то ранее неизвестные возможности, но, опять же, в определенных рамках, практически не дающих никакого простора для творчества. По сути дела, SSI — это не что иное как некоторые возможности языка Perl, изложенные таким образом, что применение их здесь требует гораздо меньших затрат от программиста на разработку и написание кода.

Достаточно искушенный пользователь найдет множество аналогий SSI с другими элементами из темы компьютерного искусства. Одним может показаться, что это очередной вариант каких-то новых особых тэгов html, сама особенность которых заключается в том, что они не передаются на сторону клиента, а исполняются непосредственно на сервере. Другие найдут аналогии с неким командным языком, наподобие того, что интерпретируется command.com’ом в dos и windows, но предназначенного исключительно для контроля передачи информации через глобальную сеть. Третьим покажется, что включения SSI можно сравнить с директивами компилятору в каком-нибудь Pascal или C. На самом деле и тот, и другой, и третий варианты будут верны по-своему.

По стилю написания SSI черезвычайно похож на макроязык, применяемый в C++. Здесь тоже есть свои директивы, свои переменные включения и т. д. Непосредственно элементы SSI — это команды, заставляющие серевер дописывать какие-то элементы в код, включаются в HTML-документ, хотя и работают только на сервере. Синтаксис подобных команд имеет следующий вид:

<!--#element attribute=value attribute=value … -->

Очень часто значения атрибутов помещается в двойные кавычки, хотя это и не обязательно. Некоторые команды позволяют иметь только одну пару "атрибут-значение". Важно так же обратить внимание на то, что заключительная часть комментария (-->) должна всегда отделяться от директивы пробелом, иначе она будет воспринята как ее часть. Перед тем как загрузить содержимое документа куда-либо в броузер, сервер просматривает его содержимое, игнорируя обычные тэги и скрипты, при этом интерпретируя только SSI -директивы и выполняя действия ими предписываемые. При этом на сторону клиента грузится не сама директива, а тот html или Script-коды, которые эта директива требует автоматически при загрузке включить документ.

Далее с помощью SSI можно не только, в зависимости от некоторых условий, выводить определенные части документа, не только формировать документ из заранее определенных кусочков, но и вставлять результат работы некоторого CGI-сценария или программы прямо в документ.

Где это можно посмотреть?

Как уже отмечалось ранее, директивы SSI невозможно просмотреть в стандартном броузере, они выглядят как HTML-коментарии и интерпретируются соответственно. Что бы заниматься подобными вещами у себя на компьютере, вам следует установить себе виртуальный сервер. Как можно догадаться из названия — это программа, которая имитирует сервер на простом домашнем компьютере. Выражается это, на самом деле, не только в том, что вы сможете потренироваться в написании документов с SSI-командами.

С помощью подобной программы возможно сделать из своей персоналки действительно настоящий портал со своим контроллером входящего и исходящего трафиков и даже со своей личной службой DNS-адресации, то есть, например, можно сделать себе домен первого уровня в какой-то локальной сети, и все ее пользователи тогда смогут зайти на ваш сайт, просто набрав его имя в командной строке своего броузера, без всяких лишних точек и слэшев.

Самым популярным виртуальным сервером на сегодняшний день является сервер Apache. Он достаточно свободно распространяется на многочисленных прилавках, торгующих дисками с программным обеспечением, — как вы понимаете, обязательно лицензионным. Лично я себе такую лицензионную версию купил за 60 рублей, уже не помню, где. Однако дело не в этом. В стандартном дистрибутиве Apache имеется модуль mod_include, который непосредственно занимается SSI. Начиная с версии 1.2 он имеет расширенное количество директив и называется — XSSI (eXtended SSI). По умолчанию, он включен в компиляцию.

Установка и начало работы

Установка производится автоматически, соответственно, никаких особых знаний для своего проведения не требует, однако, для того чтобы начать работу с SSI после установки, нужно включить механизм Server-Side Includes. Для этого нужно установить обработчик "server-parsed" для нужной страницы. Любой документ, у которого он установлен, будет сканироваться уже упоминавшимся модулем mod_include, если включена опция "Includes" в свойствах самой программы.

Если вы предполагаете иметь на своем компьютере достаточно малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующие две строки:

AddType text/html .shtml

AddHandler server-parsed .shtml

И далее устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в том же файле конфигурации указать:

AddHandler server-parsed .html

После выполнения описанных действий в дальнейшем любой файл с расширением SHTML будет автоматически распознаваться как имеющий SSI-директивы и интрпретироваться, соответственно, перед отображением в броузере.

Виртуальный сервер — вещь интересная, полезная, а в некоторых случаях необходимая, однако ввиду того, что статья посвящена другому, а также справедливости ради, могу сказать, что для просмотра файлов с ограниченным количеством SSI-директив его устанавливать вовсе не обязательно. Подобное расширение HTML-технологий поддерживается в генераторе Macromedia Dreamweaver 3, однако поддерживается довольно убого, работая почти в половину возможностей. К тому же, чтобы просмотреть такой документ, нужно помимо того что устанавливать ему расширение .shtml либо .shtm, как и в случае с сервером Apache, изначально открывать его в самом DreamWeaver, после чего, пользуясь командой "Файл -> Предварительный просмотр" наслаждаться видом своего творения непосредственно в броузере. Подобный подход можно назвать удобным с большой натяжкой, поэтому во избежание лишних трудностей следует все же установить на персональный компьютер виртуальный сервер.

Базовые директивы

Как уже отмечалось, директивы SSI включаются в HTML-документ в виде комментариев (это не мешает вам использовать обычные комментарии). Каждая такая директива заставляет интерпретатор Apache выполнять определенное действие, будь то включение в документ стороннего html-кода, либо установка параметров самого документа. Также существуют команды альтернативного выбора, которые заставляют выполнять последующий после них ряд действий в случае, если какое-либо условие окажется истинным. Рассмотрим по-порядку определенные в Apache элементы SSI, отвечающие за определенную совокупность действий.

Свойства документа

Для переопределения некоторых свойств отображаемого документа в Apache существует параметр config, который контролирует различные аспекты сканирования. Его атрибутами могут быть:

errmsg — устанавливает сообщение, выводящееся при возникновении ошибки; в большинстве случаев целесообразно установить в пустую строку;

sizefmt — устанавливает формат, в котором будет выводиться размер файла. Формат соответствует передаваемому библиотечной функции strftime;

timefmt — устанавливает формат, в котором будет выводиться дата.

К примеру, если мы хотим, чтобы в случае ошибки загрузки или сканинга нашего документа выводилось нами определенное сообщение, то нужно в shtml-документ добавить следующую строку

<!--#config errmsg="Привет чел…!" -->

В этом случае на экране пользователя вместо скучного и опостылевшего сообщения типа "Не удается отобразить что-то там, что должно грузиться. Проверьте правильность адреса, и все такое" высветится описанное ранее приветствие, которое, несомненно, вызовет с его стороны необыкновенную симпатию к вашему ресурсу и заставит его вновь и вновь пытаться произвести загрузку.

На самом деле, эта директива используется крайне редко, а чаще всего не используется вообще, так как не дает в руки разработчику в ообщем-то никаких реальных преимуществ. Соответственно, не каждый сервер содержит ее в своем наборе SSI-команд и поэтому нет никакой уверенности, что она будет работать именно на вашем хостинге. Что касается домашних компьютеров, помимо Apache, существует еще великое множество подобных ему виртуальных серверов. И эта команда поддерживается далеко не во всех. Поэтому в большинстве случаев рекомендуется вообще не использовать директиву config.

Свойства файла

В зарезервированном наборе свойств, которые можно применять к файлу, в ообщем-то, ничего необычного нет. Заметно только, что количество атрибутов явно не соответствует действительным свойствам любого такого файла. Связано это, вероятно, с тем, что технология новая и недоработанная — а соответственно, все нужное будет появляться постепенно в следующих ее версиях, если, конечно, все это будет существовать. Ну а пока для чтения свойств сканируемого файла мы имеем следующие команды.

flastmod — выводит дату последней модификации файла в определенном с помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.

fsize — выводит размер файла в определенном с помощью sizefmt формате. Допустимые атрибуты:

file — определяет путь к файлу относительно сканируемого документа; на самом деле, этот атрибут используется очень редко, так как путь к файлу нужно указывать в формате, определенном на платформе операционной системы Linux, а это связано с возможностью возникновения ряда ошибок при разработке документа пользователями, имеющими дело только с windows — например, такой путь не может содержать ../ и не может быть абсолютным путем. Во избежание всего только что описанного следует использовать параметр virtual, путь к которому можно указывать всеми известными разумными способами.

virtual — определяет стандартный кодированный URL относительно сканируемого документа, или при наличии в начале слэша (/), — относительно корня документов узла.

Динамические включения в документ

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

include — включает текст другого документа или файла в сканируемый файл. К включаемому файлу применяются все установленные правила ограничения доступа. Если для каталога, из которого включается файл, установлена опция IncludesNOEXEC, и включение данного документа привело бы к запуску программы, то документ не включается, и выводится сообщение об ошибке. CGI сценарии вызываются, как обычно, с помощью URL, который может содержать кодированную строку запроса (query string). Положение файла указывается с помощью атрибутов:

file — указывает путь относительно сканируемого документа; как уже отмечалось, такой путь не может содержать ../ и не может быть абсолютным путем; поэтому всегда предпочтительнее использовать атрибут virtual;

virtual — содержит кодированный URL, относительный или абсолютный; URL не может содержать имя протокола или имя хоста и может содержать строку запроса.

Работа с переменными

Переменной в SSI считается любая стро’ка, а также любая внутренняя переменная окружения. Для работы с переменными предусмотрены следующие команды:

echo — выводит значение ранее установленной переменной SSI. Допустимым атрибутом является var, в котором определяется сама переменная, значение которой будет выводиться. Переменная SSI — это какая-то строка, которая при подстановке в документ образует правильную структуру, будь то тэг или его атрибут, либо еще что-нибудь.

set — устанавливает значение переменной. Ее атрибутами являются var, определяющий имя переменной, и value, определяющий ее значение.

Здесь следует дать некоторые пояснения, зачем вообще нужны переменные в SSI. Нужны они лишь для того, чтобы автоматически подставлять какие-то строковые значения в тэги, тем самым их изменяя. Например, мы определили следующую переменную:

<!--#set var="I_TITLE" value="Лучший сайт глобальной сети Интернет" -->

которая обозначает какое-то значение заголовка документа. Использовать мы ее можем следующим образом:

<title><!--#echo var="I_TITLE" --></title>

При этом документ, в котором будет использована данная строка, получит именно такой заголовок. Следует отметить, что между тэгами <title></title>, помимо SSI-команды, вывести переменную I_TITLE, могло быть еще что угодно, вплоть до еще одной переменной. Здесь особых ограничений не существует. В этом случае мы получили бы просто заголовок, составленный из двух или более строк.

Переменные включения

В дополнение к стандартным переменным окружения CGI, модуль SSI делает доступными для директив и условий, а также для вызываемых через SSI-сценариев следующие переменные:

DATE_GMT — текущее время по Гринвичу;

DATE_LOCAL — текущее локальное (для сервера) время;

DOCUMENT_NAME — имя файла (без каталогов) документа, запрошенного пользователем;

DOCUMENT_URI — декодированный URL запрошенного пользователем документа;

LAST_MODIFIED — дата последней модификации документа, запрошенного пользователем. То есть, во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.

printenv — выводит содержимое переменных окружения. Вызывается без параметров.

Важно отличать переменные окружения от отдельных строк. Для этого в SSI принято их записывать со знаком доллара впереди, а простые строки должны быть обрамлены в кавычки, таким образом $ LAST_MODIFIED — это переменная окружения, а "LAST_MODIFIED" — это обыкновенная строка.

Условные операторы

Для динамического формирования внешнего вида загружаемых документов, в зависимости от действий пользователя либо просто от свойств самого документа, в SSI существуют условные операторы или контролирующие элементы, назначение которых заключается в выполнении каких-то действий в зависимости от условия, определенного разработчиком страницы. На сегодняшний день условные операторы являются единственным элементом программирования, используемым в SSI. Базовыми элементами контроля являются следующие директивы:

<!--#if expr="test_condition" --> — проверяет условие test_condition, и в случае его верности выполняет все последующие операции, определенные SSI-директивами до строки <!--#endif -->. В обратном же случае все находящееся между этими двумя операторами игнорируется и программа сканирует документ далее, в том случае, если внутри игнорируемой области не определены какие-либо другие операторы выбора.

<!--#elif expr="test_condition" --> — если вставляется в документ, то всегда должно следовать за <!--#if expr="test_condition" -->. Использование по отдельности, как можно догадаться из смысловой нагрузки, для данной директивы не предусмотрено. Начинает действовать в случае, если условие в первом до нее операторе if явилось ложным. Тогда данная команда проверяет свое условие test_condition, не обязательно совпадающее с условием вызывающей директивы, и в случае, если оно имеет значение "правда", вызывает какое-либо действие, описываемое директивой далее в документе до следующего элемента <!--#elif expr="test_condition" -->.

<!--#else --> — если кто-то знаком с языком программирования Javascript или Java, то поймет, что этот оператор имеет примерно такой же смысл, как switсh(default()). Другими словами, он выполняется только тогда, когда все операторы <!--#elif expr="test_condition" -->, следующие до него, не дали желаемого результата. Пишется всегда на заключительной стадии оператора if прямо перед <!--#endif -->.

<!--#endif --> — не проверяет никаких условий. Просто закрывает блок сравнений, открываемый оператором <!--#if expr="test_condition" -->. Служит, как можно понять, для предотвращения путаницы в документе в случае двух и более операторов if, однако наличие его обязательно в любом случае.

При записи условных операторов в SSI полезно помнить следующий набор правил и свойств переменных.

Элементы elif и else являются необязательными.

Элемент endif заканчивает элемент if и является обязательным.

test_condition может быть одним из следующих:

string — истинно, если string не пуста;

string1 = string2 — истинно, если первая строка соответствует второй.

string1 != string2 — истинно, если первая строка не соответствует первой.

string1 < string2 — истинно, если первая строка меньше второй.

string1 <= string2 — истинно, если первая строка либо соответствует второй, либо меньше ее.

string1 > string2 — истинно, если первая строка больше второй.

string1 >= string2 — истинно, если первая строка либо соответствует второй, либо больше нее.

Если string2 записывается в форме /string/ то тогда она интерпретируется как регулярное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;

string — это практически любая строка, содержащая либо тэг целиком, либо его часть либо код какого-либо скрипта, в общем, любую часть документа. Так же это может быть любая переменная окружения, определенная в самом SSI либо в CGI-скрипте, совместно с которым используется документ.

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

( 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 считается строка любого типа или зарезервированные переменные окружения. Так же, как и в языке Perl в SSI, переменные инициируются с помощью знака доллара($). Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI-директив. В этих случаях знак доллара можно вставить, предварив его слэшем:

<!--#if expr="$a = \$test" -->

Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:

<!--#set var="Zed" value="${a}bc_${abc}" -->

В результате такого присвоения, переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.

Используются подобные сложные структуры довольно редко, так как относятся больше к изощрениям с использованием зарезервированных возможностей, однако ради интереса и для большей ясности последние объявления следует немного пояснить.

Представим, что у нас в каком-то стороннем файле — пусть он называется storon_X.shtml — существует следующий набор директив:

<!--#set var="_title" value="Программы на языках высокого уровня" -->

<!--#set var="__title" value="Обзоры новейших генераторов html-кода" -->

Все их действие заключается в установке двум строковым переменным (_title и __title) определенных значений, которые потом предполагается использовать на месте заголовка какого-либо документа. Также предположим, что у нас есть еще один сторонний документ (назовем его storon_X2.shtml), который в своем заголовке должен иметь следующую строку текста: "Программы на языках высокого уровня Различные навороченные фишки Обзоры новейших генераторов html-кода". Тогда, чтобы сформировать переменную такого вида уже в самом текущем документе, нам понадобится объявление типа:

<!--#set var="SuperTitle" value="${_title} Различные навороченные фишки ${__title}" -->

Все это имеет смысл, если у нас есть еще один сторонний фаил (этот пусть называется просто XXX.shtml), который в своем заголовке содержит строку "Программы на языках высокого уровня Еще много чего крутого". Тогда в нем объявление соответствующей переменной будет выглядеть следующим образом:

<!--#set var="SuperTitle" value="${_title} Еще много чего крутого " -->

Таким образом, для формирования сразу двух заголовков различных файлов мы можем использовать один лишь storon_X.shtml. Конечно, для того чтобы все заработало, надо не забыть включить в них обоих следующую незамысловатую строку:

<!--#include virtual="storon_X.shtml" -->

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

Что дальше?

На самом деле, значение SSI трудно переоценить. Хотя технология и является еще довольно недоработаным продуктом, но уже сегодня можно смело сказать, что она значительно облегчает жизнь многим людям, так или иначе имеющим отношение к вэб-дизайну. Вот предположим, что у нас есть серия документов, содержащих каждый по одной какой-либо картинке. Причем, в каждом картинка своя, со своими размерами и, соответственно, содержанием. Более того, документы отличаются друг от друга по своему заголовку и ключевым словам, по которым ищет их поисковая система. Представим также, что таких документов на нашем сервере больше, чем волос на голове у Ленни Кравитца.

Как бы то ни было, согласимся, что писать для каждого из таких документов свой отдельный html-код, по меньшей мере, самонадеяно. Хотя, конечно, найдутся, как всегда, вполне вменяемые люди, которые закричат, что, мол, они такое делали, и не раз. Спорить с ними на эту тему бесполезно — лучше согласиться. Такие люди остро нуждаются в понимании, сочувствии, а может быть, даже длительном лечении. Как бы то ни было, для всего остального прогрессивного человечества будет гораздо легче использовать SSI.

Советовать что-либо для самостоятельного изучения не буду, все пишут в общем-то одно и то же, за исключением разве что порядка слов в предложениях. Статья была призвана не столько описать достаточно еще молодую технологию, сколько ввести читателя в курс дела. И если кто-то заинтересовался, то сам найдет все, что ему нужно.

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

Продолжение следует…

http://www.comprice.ru/

 
Еще
Оглавление раздела
Содержание / Новости

Карта сайта
О сайте
Ссылки

Форум
Обратная связь
Если ты нашел ошибку, хочешь что-то посоветовать либо поругать меня, не посчитай за труд написать об этом в следующем поле...







К началу страницы© 2002—2008 Argon