ТаблицейБлоками.

Справочник Веб-дизайнера: Директивы SSI

Последняя модификация: 10.08.2014 г

Страница загружена с адреса: http://webdesign.site3k.ru/docs/ssi.html

Моя студия веб-дизайна

SSI - Server Side Includes. Учебник

  1. Директивы SSI
  2. Операции и операторы SSI
  3. Особенности SSI скриптов
  4. Область применения SSI
  5. Пример из жизни

Директивы SSI

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

 

#include file – включает текст другого файла в текущий файл. Если это cgi-скрипт, запускает его и вставляет в страницу выданный им результат.

Имя включаемого файла не должно содержать путь (он должен находиться в одном каталоге с включающим файлом), но может содержать параметры типа myscript.shtm?myparam=1.

Например: <!--#include file="ssi.html" -->

 

#include virtual – подобно #include file включает текст другого файла в текущий файл или запускает cgi-script. В отличие от #include file может содержать относительный или абсолютный путь без названия протокола (HTTP://) и доменного имени (webdesign.site3k.ru) – то есть, не может указывать на файл другого сайта (для экспорта файлов другого сайта применяется PHP).

В директиве допускаются пути типа:

example/_ssi.html – указывает на файл _ssi.html, находящийся в подкаталоге example текущего каталога.

../_ssi.html – указывает на файл _ssi.html, находящийся в каталоге, в котором вложен текущий (родительском).

/_ssi.html – указывает на файл _ssi.html, находящийся в корневом каталоге сайта (для http://webdesign.site3k.ru/ это файл http://webdesign.site3k.ru/_ssi.html).

Например: <!--#include virtual="_ssi.html" -->

 

#fsize file – Вставляет размер указанного файла. Файл, размер которого определяется, должен находиться на том же сайте, что и файл, содержащий данную инструкцию. Более того, он должен находится либо в том же каталоге, либо во вложеном каталоге.

Например: <!--#fsize file="ssi.html" --> Выведет размер данного файла: 37K.

Формат размера определяется по SSI-инструкции #config sizefmt.

 

#fsize virtual – Вставляет размер указанного файла. В отличие от #fsize file может содержать относительный или абсолютный путь без названия протокола (HTTP://) и доменного имени и, таким образом, указывать на файл в другом каталоге того же сайта.

Например: <!--#fsize virtual="/docs/ssi.html" --> Выведет размер данного файла: 37K.

Формат размера определяется по SSI-инструкции #config sizefmt.

 

#flastmod file – Вставляет дату последней модификации указанного файла. Файл, дата модификации которого определяется, должен находиться на том же сайте, что и файл, содержащий инструкцию. Так же, он должен находится либо в том же каталоге, либо во вложеном каталоге.

Например: <!--#flastmod file="ssi.html" --> Выведет дату последней модификации данного файла: 10.08.2014 г.

Формат даты определяется по SSI-инструкции #config timefmt.

 

#flastmod virtual – Вставляет дату последней модификации указанного файла. В отличие от #flastmod file может содержать относительный или абсолютный путь без названия протокола (HTTP://) и доменного имени и, таким образом, указывать на файл в другом каталоге того же сайта.

Например: <!--#flastmod virtual="/docs/ssi.html" --> Выведет дату последней модификации данного файла: 10.08.2014 г.

Формат даты определяется по SSI-инструкции #config timefmt.

 

#exec cmd – Запускает внешнюю программу и вставляет в содержимое страницы результат ее выполнения.

Например, <!--#exec cmd="myprog" -->

 

#exec cgi – Подобно #exec cmd запускает cgi-скрипт и вставляет в содержимое страницы результат его выполнения.

Например, <!--#exec cgi="/cgi-bin/example.cgi" -->

Однако многие дизайнеры рекомендуют использовать для этого #include file или #include virtual, так как #exec cgi может не работать на некоторых серверах.

 

#config errmsg – определяет сообщение, выводящееся в текст при возникновении ошибки. Поскольку сообщение выводится прямо в текст страницы, может иметь смысл привести его к пустой строке (<!--#config errmsg="" -->) или попросить посетителя сообщить автору об ошибке (<!--#config errmsg="При открытии страницы произошла ошибка. Пожалуйста, сообщите об этом по адресу: mymail@myserver.ru" -->).

 

#config timefmt – определяет формат даты для команды #flastmod file, используя следующие параметры:

ФорматОписаниеПример
ФорматОписаниеПример
Формат SSI-директивы #config timefmt
%aКраткое название дня неделиMon
%AПолное название дня неделиMonday
%bАббревиатура названия месяцаDec
%BПолное название месяцаDecember
%dДень месяца01 (не 1)
%DДата в формате "%m/%d/%y"12/31/99
%eДень месяца13
%HЧасы в 24-часовом формате13
%IЧасы в 12-часовом формате01
%jДень года235
%mНомер месяца01
%MМинуты03
%pAM/PM (до полудня/после)AM
%rВремя в формате "I:M:S p"11:35:46 PM
%SСекунды34
%sВремя в секундах с 01.01.1970957228726
%TВремя в формате "%H:%M:%S"14:05:34
%UНеделя года16
%wНомер дня недели4
%yГод в формате ГГ99
%YГод в формате ГГГГ1999
%ZВременная зонаMSK

В результате, не подготовленная команда <!--#flastmod file="ssi.html" --> дает следующий вывод: 10.08.2014 г

И эта же команда, после SSI директивы <!--#config timefmt="%d.%m.%Y г" -->, выдаст: 10.08.2014 г

 

#config sizefmt – определяет формат размера для команды #fsize file. <!--#config sizefmt="abbrev" --> настраивает на вывод размера файла в килобайтах ( 37K), а <!--#config sizefmt="bytes" --> – в байтах (37,782)

 

#printenv – Подобно команде SET старого, доброго DOS-а, выводит текущие значения переменных окружения, такие как:

HTTP_USER_AGENT – название браузера, которым пользуется посетитель.

REMOTE_ADDR – IP-адрес посетителя.

REMOTE_HOST – адрес посетителя в нормальной форме.

SERVER_ADDR – IP-адрес сайта.

SERVER_NAME – адрес сервера.

CHARSET_HTTP_METHOD – протокол ((none))

REQUEST_METHOD – метод запроса страницы (GET)

HTTP_HOST – имя сайта (webdesign.site3k.ru)

REQUEST_URI – вся строка запроса, без указания протокола и имени сайта (/docs/ssi.html)

QUERY_STRING – все, что находилось в адресной строке после вопросительного знака (обычно это параметры форм) Попробуйте вызвать эту страницу с какими-то параметрами после вопросительного знака и вы увидете их здесь ()

SCRIPT_NAME – полный путь к странице от корня сайта (/docs/ssi.html). Сочетание http://, HTTP_HOST и SCRIPT_NAME даёт привычный адрес страницы http://webdesign.site3k.ru/docs/ssi.html).

DOCUMENT_NAME – только название файла. (ssi.html)

HTTP_REFERER – страница, с которой перешли на эту ((none))

SCRIPT_FILENAME – полный путь к странице на сервере (/home/users1/s/supervisork/domains/webdesign.site3k.ru/docs/ssi.html)

SERVER_SOFTWARE – название сервера и установленных модулей.

SERVER_ADMIN – почтовый адрес владельца сервера, указанный при установке.

DATE_LOCAL – сегодняшнее время и дата в вашем часовом поясе.

DATE_GMT – то же, но по Гринвичу.

LAST_MODIFIED – дата и время последнего обновления страницы.

Практическое применение команда <!--#printenv --> имеет только для отладки страницы, что очень важно, учитывая тот факт что, у каждого сервера свой набор переменных. Вот что получается в результате ее применения на сайте webdesign.site3k.ru:

downgrade-1.0=
suppress-error-charset=
HTTP_HOST=webdesign.site3k.ru
HTTP_X_REAL_IP=54.161.65.141
HTTP_X_PROTOCOL=HTTP/1.0
HTTP_X_SERVER_IP=217.107.34.2
HTTP_X_FORWARDED_FOR=54.161.65.141
HTTP_X_FORWARDED_PROTOCOL=http
HTTP_CONNECTION=close
HTTP_USER_AGENT=CCBot/2.0 (http://commoncrawl.org/faq/)
HTTP_ACCEPT_LANGUAGE=en-us,en-gb,en;q=0.7,*;q=0.3
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
PATH=/usr/bin:/bin:/usr/local/bin
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache
SERVER_NAME=webdesign.site3k.ru
SERVER_ADDR=217.107.34.2
SERVER_PORT=80
REMOTE_ADDR=54.161.65.141
DOCUMENT_ROOT=/home/users1/s/supervisork/domains/webdesign.site3k.ru
SERVER_ADMIN=info@jino.ru
SCRIPT_FILENAME=/home/users1/s/supervisork/domains/webdesign.site3k.ru/docs/ssi.html
REMOTE_PORT=59396
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/docs/ssi.html
SCRIPT_NAME=/docs/ssi.html
DATE_LOCAL=29.06.2016 г
DATE_GMT=29.06.2016 г
LAST_MODIFIED=10.08.2014 г
DOCUMENT_URI=/docs/ssi.html
USER_NAME=supervisork
DOCUMENT_NAME=ssi.html
WORDS=
KEYW=
DESCRIP=
TITL=
HEAD=
ROB=index, follow
BROWSER=CCBot/2.0 (http://commoncrawl.org/faq/)
DIR=
PER=YES

Однако, сами переменные, применяются часто. Например в SSI-директиве #echo var.

 

#echo var – Используется для вывода значения переменной указанной в качестве параметра.

Например:

Ваш IP – <!--#echo var="REMOTE_ADDR" -->
Ваш браузер – <!--#echo var="HTTP_USER_AGENT" -->
Мой сервер – <!--#echo var="SERVER_NAME" -->
Вы пришли со страницы – <!--#echo var="HTTP_REFERER" -->
Вы находитесь на странице – http://<!--#echo var="HTTP_HOST" --><!--#echo var="SCRIPT_NAME" -->

 

Выводит следующий текст:

Ваш IP – 54.161.65.141 
Ваш браузер – CCBot/2.0 (http://commoncrawl.org/faq/) 
Мой сервер – webdesign.site3k.ru 
Вы пришли со страницы – (none) 
Вы находитесь на странице – http://webdesign.site3k.ru/docs/ssi.html

В новых версиях SSI по умолчанию команда SSI echo использует кодирование entity и добавлен параметр encoding. Encoding должен задаваться ДО параметра var. Возможные значения encoding:

entity — (по умолчанию) будет произведено преобразование специальных HTML-символов в сущности и русский текст в кодировке Windows-1252 превратится в кракозябры (назначение данного преобразования непонятно);

url — будет произведено escape-преобразование, все символы все английского алфавита приобретут вид %nn, где nn - код символа в 16-ричной кодировке, что позволит их применять в строке URL;

none — не будет производиться никаких преобразований (как и раньше, с той только разницей, что HTML-сущности, которые раньше кодировались, кодироваться не будут и в переменные SSI можно вставлять угловые скобки и амперсанды).

Пример: <!--#echo encoding="none" var="MyText" -->

 

#set var value – Устанавливает значение переменной, если переменной нет – создает. Формат команды set var="ИМЯ_ПЕРЕМЕННОЙ" value="ЕЕ_ЗНАЧЕНИЕ"

Например, такой код:

Значение переменной SERVER_NAME=«"<!--#echo var="SERVER_NAME" -->»
Сменим значение: <!--#set var="SERVER_NAME" value="discoverer.by.ru" -->
Теперь значение переменной SERVER_NAME=«<!--#echo var="SERVER_NAME" -->»

 

Выведет следующие строки:

Значение переменной SERVER_NAME=«webdesign.site3k.ru»
Сменим значение: 
Теперь значение переменной SERVER_NAME=«discoverer.by.ru»

 

Конечно, подменять стандартные переменные окружения может и вовсе не имеет смысла, но назначать свои переменные бывает удобно, например:

<!--#set var="MyText" value="Это самое наглядное пособие по <B>SSI</B>" -->

Чтобы в нужном месте страницы применить команду <!--#echo encoding="none" var="MyText" -->

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

Естественно, определить переменную, нужно до ее применения на странице.

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

Операции и операторы SSI.

SSI не поддерживает математических вычислений и строковых операций. Однако, SSI-технология поддерживает подстановки, которые можно расценивать как аналог конкатенации. Подстановка позволяет использовать переменные окружения в качестве параметров SSI-директив и комбинировать значения переменных и строк (производить конкатенацию). При подстановке переменные заключаются в фигурные скобки «{}», и предваряются знаком доллара «$» (иногда скобки можно опустить).

Например:

<!--#set var="NEW_VAR" value="http://${HTTP_HOST}${SCRIPT_NAME}" -->
<!--#echo var="NEW_VAR" -->

Поместит в переменную NEW_VAR полный путь и имя данной страницы и выведет его в текст:

http://webdesign.site3k.ru/docs/ssi.html

При необходимости включения в подстановку знаков доллара, слеша, фигурных скобок и кавычек, их предваряют слешем:

\$ \/ \" \{ \}

#if, #elif, #else и #endif – Условные операторы. Позволяют выполнять код или выводить текст на страницу в зависимости от результата логического сравнения. Код, не соответствующий условию, никоим образом не появится даже при просмотре «исходного текста».

Формат оператора:

<!--#if expr="ПЕРВОЕ_УСЛОВИЕ" -->
HTML-код, который будет выводиться, если ПЕРВОЕ_УСЛОВИЕ истинно
<!--#elif expr="ВТОРОЕ_УСЛОВИЕ" -->
HTML-код, который будет выводиться, если ПЕРВОЕ_УСЛОВИЕ ложно, а ВТОРОЕ_УСЛОВИЕ истинно
<!--#else -->
HTML-код, который будет выводиться, если все условия ложны
<!--#endif -->

Условие - это либо строка, которая является истинной, если она непустая, или набор операторов сравнения строк. Операторами могут быть:

Если вторая строка заключена в слеши («/»), она является регулярным выражением. Например, условие истинно, если в первой строке встречается хоть одно вхождение второй строки.

Можно объединять несколько операторов сравнения с помощью операторов && («логическое И») и || («логическое ИЛИ»). Для группирования условий используются скобки. Для включение в условие переменных, их предваряют знаком доллара. Например:

Страница запрошена
<!--#if expr="$HTTP_USER_AGENT=/Opera/" -->
браузером Opera
<!--#elif expr="$HTTP_USER_AGENT=/MSIE/ || $HTTP_USER_AGENT=/Microsoft/" -->
браузером Microsoft Internet Explorer
<!--#elif expr="$HTTP_USER_AGENT=/Mozilla/" -->
браузером Netscape Navigator
<!--#else -->
поисковым роботом
<!--#endif -->

Результат:

Страница запрошена

поисковым роботом
 

Внимание: Любая SSI-директива должна начинаться с символов <!--# (комментарий и решетка), и завершаться символами --> (конец комментария). При этом, между концом SSI директивы и дефисами конца комментария должен быть, по крайней мере, один пробел – иначе сервер может не правильно распознать директиву, приняв дефисы и угловую скобку за конец команды.

Особенности SSI скриптов

Область применения SSI.

Обычно SSI применяется там же, где  Frame, Object, Script src=… и т. д., например, для включения в WEB-страницу повторяющихся фрагментов (меню, баннерные коды, заголовки). Однако, механизм включения совершенно иной. Если в Frame, Object, Script src=… и т. д. включаемый файл просто выдается сервером и уже на месте вставляется агентом пользователя (браузером), то в случае с SSI браузер получает страницу в уже готовом виде. Включение происходит прямо на сервере, а это порождает следующие отличия:

Что применять: Frame, Object, Script src=… или SSI – личное дело каждого.

Пример из жизни.

Хороший и простой пример вы можете глянуть и на странице Способы хранения веб-страниц: документы FrontPage или базы данных

 

Пример фреймовой организации вы видите здесь. Другим примером может послужить сайт http://praktika.h14.ru, основанный на SSI.

Вариант с применением SSI-внедрения:

Исходный код главной страницы – index.html, в общих чертах:

Открыть в отдельном окне

Включаемый файл _head.shtml, имеет код:

Открыть в отдельном окне

Включаемый файл _logo.shtml:

Открыть в отдельном окне

Включаемый файл _menu.shtml:

Открыть в отдельном окне

Включаемый файл _center1.shtml:

Открыть в отдельном окне

Включаемый файл _ban.shtml:

Открыть в отдельном окне

Включаемый файл _ban2.shtml:

Открыть в отдельном окне

Включаемый файл _foot.shtml:

Открыть в отдельном окне

Этот же сайт во фреймовом варианте состоял бы из таких страниц (один из многих возможных вариантов):

index.html

Открыть в отдельном окне

Включаемый файл lefttop.htm:

Открыть в отдельном окне

Включаемый файл righttop.htm:

Открыть в отдельном окне

Включаемый файл menu.htm:

Открыть в отдельном окне

Включаемый файл foot.htm:

Открыть в отдельном окне

Практическое отличие одной и той же страницы, построенной с применением различных технологий лишь в том, что каждая страница объектов технологии IFRAME выглядит полнее и является вполне самостоятельной. Это несколько увеличивает время загрузки первой страницы, но зато, за счет кэширования, повторяющиеся фрагменты не приходится загружать со следующей страницей и дальнейшая загрузка значительно ускоряется (подробней о преимуществах Frame смотрите в  «Если вам не нравятся фреймы, значит вы не умеете их готовить»). Сочетание двух технологий включения дает наиболее качественный результат. Оно применяется на всех профессиональных сайтах и, если Frame и Object могут где-то не встретиться, то, по крайней мере, Script src=… и <link rel="stylesheet" href="…" type="text/css"> (то же включение кода, содержащегося в отдельном файле и загружающегося только однажды), используется повсеместно.

Применение IFRAME не может полностью заменить SSI, так как SSI позволяет не только загрузить фрагменты по условию (что можно решить и скриптом), но и, как показано в примере, через переменные передать им любые параметры. Без SSI это можно сделать только методом POST или через HTTP_REFERER (продолжение имени файла, после вопросительного знака), для дальнейшей обработки каким-либо скриптом. Но возможности такой передачи не идут ни в какое сравнение с возможностями передачи значений SSI переменных. Поэтому, применение SSI может потребоваться даже на страницах, основанных на фреймах – чем больше инструментов нам доступно, тем лучше и быстрее получается результат.

 

Комментарии к странице (всего 11)

 

 

 


На главную страницу сайта