КрасносельскийКонстантинКонстантинович |
ТаблицейБлоками.Справочник Веб-дизайнера: Директивы SSI |
Последняя модификация: 10.08.2014 г
Страница загружена с адреса: http://webdesign.site3k.ru/docs/ssi.html
В начале перечислю используемые в 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, используя следующие параметры:
Формат | Описание | Пример |
---|---|---|
Формат | Описание | Пример |
%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 |
%p | AM/PM (до полудня/после) | AM |
%r | Время в формате "I:M:S p" | 11:35:46 PM |
%S | Секунды | 34 |
%s | Время в секундах с 01.01.1970 | 957228726 |
%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 вся строка запроса, без указания протокола и имени сайта (/div/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/users/s/supervisork/domains/webdesign.site3k.ru/docs/ssi.html)
SERVER_SOFTWARE название сервера и установленных модулей.
SERVER_ADMIN почтовый адрес владельца сервера, указанный при установке.
DATE_LOCAL сегодняшнее время и дата в вашем часовом поясе.
DATE_GMT то же, но по Гринвичу.
LAST_MODIFIED дата и время последнего обновления страницы.
Практическое применение команда <!--#printenv --> имеет только для отладки страницы, что очень важно, учитывая тот факт что, у каждого сервера свой набор переменных. Вот что получается в результате ее применения на сайте webdesign.site3k.ru:
REDIRECT_div=1
REDIRECT_downgrade-1.0=
REDIRECT_suppress-error-charset=
REDIRECT_STATUS=200
downgrade-1.0=
suppress-error-charset=
HTTP_HOST=webdesign.site3k.ru
HTTP_X_REAL_IP=3.145.7.253
HTTP_X_PROTOCOL=HTTP/1.1
HTTP_X_SERVER_IP=81.177.135.173
HTTP_X_FORWARDED_FOR=3.145.7.253
HTTP_X_FORWARDED_PROTOCOL=http
HTTP_X_FORWARDED_PROTO=http
HTTP_CONNECTION=close
HTTP_ACCEPT=*/*
HTTP_USER_AGENT=Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
HTTP_ACCEPT_ENCODING=gzip, br, zstd, deflate
PATH=/usr/bin:/bin:/usr/local/bin
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache
SERVER_NAME=webdesign.site3k.ru
SERVER_ADDR=81.177.135.173
SERVER_PORT=80
REMOTE_ADDR=3.145.7.253
DOCUMENT_ROOT=/home/users/s/supervisork/domains/webdesign.site3k.ru
SERVER_ADMIN=info@jino.ru
SCRIPT_FILENAME=/home/users/s/supervisork/domains/webdesign.site3k.ru/docs/ssi.html
REMOTE_PORT=36822
REDIRECT_URL=/div/docs/ssi.html
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/div/docs/ssi.html
SCRIPT_NAME=/docs/ssi.html
DATE_LOCAL=24.11.2024 г
DATE_GMT=24.11.2024 г
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=Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
DIR=div/
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 3.145.7.253 Ваш браузер Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) Мой сервер 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-директив и комбинировать значения переменных и строк (производить конкатенацию). При подстановке переменные заключаются в фигурные скобки «{}», и предваряются знаком доллара «$» (иногда скобки можно опустить).
Например:
<!--#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 -->
Результат:
Страница запрошена браузером Netscape Navigator
Внимание: Любая SSI-директива должна начинаться с символов <!--# (комментарий и решетка), и завершаться символами --> (конец комментария). При этом, между концом SSI директивы и дефисами конца комментария должен быть, по крайней мере, один пробел иначе сервер может не правильно распознать директиву, приняв дефисы и угловую скобку за конец команды.
AddType text/html .shtml AddHandler server-parsed .shtml
AddHandler server-parsed .shtml AddHandler server-parsed .html
Options +Includes
<!--#if expr="$DOCUMENT_NAME=_head.shtml" --> <meta http-equiv='refresh' content='0; URL=index.html'> <!--#endif -->
Обычно SSI применяется там же, где Frame, Object, Script src= и т. д., например, для включения в WEB-страницу повторяющихся фрагментов (меню, баннерные коды, заголовки). Однако, механизм включения совершенно иной. Если в Frame, Object, Script src= и т. д. включаемый файл просто выдается сервером и уже на месте вставляется агентом пользователя (браузером), то в случае с SSI браузер получает страницу в уже готовом виде. Включение происходит прямо на сервере, а это порождает следующие отличия:
Что применять: Frame, Object, Script src= или SSI личное дело каждого.
Хороший и простой пример вы можете глянуть и на странице Способы хранения веб-страниц: документы FrontPage или базы данных
Пример фреймовой организации вы видите здесь. Другим примером может послужить сайт http://praktika.h14.ru, основанный на SSI.
Вариант с применением SSI-внедрения:
Этот же сайт во фреймовом варианте состоял бы из таких страниц (один из многих возможных вариантов):
Практическое отличие одной и той же страницы, построенной с применением различных технологий лишь в том, что каждая страница объектов технологии IFRAME выглядит полнее и является вполне самостоятельной. Это несколько увеличивает время загрузки первой страницы, но зато, за счет кэширования, повторяющиеся фрагменты не приходится загружать со следующей страницей и дальнейшая загрузка значительно ускоряется (подробней о преимуществах Frame смотрите в «Если вам не нравятся фреймы, значит вы не умеете их готовить»). Сочетание двух технологий включения дает наиболее качественный результат. Оно применяется на всех профессиональных сайтах и, если Frame и Object могут где-то не встретиться, то, по крайней мере, Script src= и <link rel="stylesheet" href=" " type="text/css"> (то же включение кода, содержащегося в отдельном файле и загружающегося только однажды), используется повсеместно.
Применение IFRAME не может полностью заменить SSI, так как SSI позволяет не только загрузить фрагменты по условию (что можно решить и скриптом), но и, как показано в примере, через переменные передать им любые параметры. Без SSI это можно сделать только методом POST или через HTTP_REFERER (продолжение имени файла, после вопросительного знака), для дальнейшей обработки каким-либо скриптом. Но возможности такой передачи не идут ни в какое сравнение с возможностями передачи значений SSI переменных. Поэтому, применение SSI может потребоваться даже на страницах, основанных на фреймах чем больше инструментов нам доступно, тем лучше и быстрее получается результат.