SSI - Server Side Includes
'SSI
' (Server Side Includes
— включения на стороне сервера) — несложный язык для динамической «сборки» веб-страниц на сервере из отдельных составных частей и выдачи клиенту полученного HTML-документа. Реализован в веб-сервере Apache при помощи модуля [http://httpd.apache.org/docs/mod/mod_include.html mod_include]. Включённая в настройках по умолчанию веб-сервера возможность позволяет подключать HTML-файлы, поэтому для использования инструкций файл должен оканчиваться расширением .shtml
, .stm
или .shtm
Необходимо помнить, что некоторые сервисы не исполняют команды SSI, если расширение файла будет отличное от приведенных выше. Например, если расширение - .html
.
Синтаксис SSI позволяет включать в текст страницы другие SSI-страницы, вызывать внешние CGI-скрипты, реализовывать условные операции (if/else), работать с переменными и т.п. Благодаря крайней простоте языка, сборка SSI-страниц происходит очень быстро, однако многие возможности полноценных языков программирования, например, работа с файлами, в SSI отсутствуют.
Отдельные элементы синтаксиса SSI используются и в других скриптовых языках, например в ASP.
Основные команды SSI
* config — устанавливает формат сообщений об ошибках, дат и размера * set — устанавливает значение переменной * printenv — выводит список переменных окружения * echo — вставляет значение переменной * flastmod — вставляет дату и время изменения файла * fsize — вставляет размер файла * include — вставляет содержимое другого файла * if, elif, else, endif — условные операторы
Описание
'config
' — контролирует различные аспекты сканирования. Его атрибутами могут быть:
*'errmsg
' — устанавливает сообщение, выводящееся при возникновении ошибки; в большинстве случаев целесообразно установить в пустую строку;
*'sizefmt
' — устанавливает формат, в котором будет выводиться размер файла.
*'timefmt
' — устанавливает формат, в котором будет выводиться дата. Формат соответствует передаваемому библиотечной функции strftime;
Переменные для 'sizefmt
':
<pre>
<!–#config sizefmt=«abbrev»–> Выводит размер файла в килобайтах: (17k)
</pre>
<pre>
<!–#config sizefmt=«bytes»–> Выводит размер файла в байтах (17,076)
</pre>
Переменные для 'timefmt
':
{| class=«standard»
! Формат
! Описание
! Пример
Обратите внимание на то, что команды #config sizefmt и #config timefmt влияют на все связанные с ними SSI-команды от того места, откуда они были вызваны и до самого конца страницы. Поэтому каждый вызов команд #flastmod и #fsize лучше снабжать своей командой #config.
'set
' — устанавливает значение переменной. Её атрибутами являются var, определяющий имя переменной, и value, определяющий её значение.
* Подстановка переменных Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI директив. В этих случаях знак доллара можно вставить, предварив его слешом: <pre> <!–#if expr=«$a = \$test» –> </pre> Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки: <pre> <!–#set var=«Zed» value=«${a}bc_${abc}» –> </pre> В результате такого присвоения переменная Zed будет иметь значение «Xbc_Y», если переменная a равна X, а переменная abc равна Y.
'printenv
' — Выводит список так называемых «переменных окружения» с их значениями. Вызывается без параметров.
'Переменные окружения:
'
*'DOCUMENT_ROOT
' (название основной папки для вебстраниц на сервере, обычно ваша папка public_html и путь к ней)
*'USER_AGENT
' и 'HTTP_USER_AGENT
' (название браузера, которым пользуется посетитель)
*'REMOTE_ADDR
' (IP-адрес посетителя)
*'REMOTE_HOST
' (адрес посетителя в нормальной форме — например, adsl53.peterlink.ru)
*'SERVER_ADDR
' (IP-адрес вашего сайта)
*'SERVER_NAME
' и 'HTTP_HOST
' (адрес сервера, типа userguide.webservis.ru),
*'DOCUMENT_URI
', 'REQUEST_URI
' и 'SCRIPT_NAME
' (запрошенная вами страница, типа /examples/mysqlexample.shtml.),
*'DOCUMENT_NAME
' (имя файла (без каталогов) документа, запрошенного пользователем),
*'SCRIPT_FILENAME
' (полный путь к вебстранице на сервере. Например /home/home-webservis/public_html/ и так далее),
*'SERVER_SOFTWARE
' (название сервера, например, Apache/1.3.2 (Unix))
*'SERVER_ADMIN
' (почтовый адрес владельца сервера, указанный при установке),
*'DATE_LOCAL
' (сегодняшние время и дата в вашем часовом поясе(для сервера)),
*'DATE_GMT
' (текущее время по Гринвичу),
*'LAST_MODIFIED
' (дата последней модификации документа, запрошенного пользователем. То есть во вложенном SSI эта переменная будет содержать имя «главного» документа, а не вложенного).
*'HTTP_COOKIE
' (Строка Cookie установленная для текущего домена.).
'echo
' — выводит значение установленной переменной SSI. Допустимые атрибуты:
*'var
' — (обязательный) имя выводимой переменной;
*'encoding
' — (необязательный) перекодировка значения переменной перед выводом. Действует в версиях Apache 1.3.12 и выше. В версиях Apache 2.2.6 и выше по умолчанию символы кодируются в windows-1252 из-за чего ssi переменные окружения с русскими символами при отображении в документе портятся и выглядят как кракозябры, во избежание этого всегда указывайте encoding=«none». Обратите внимание, что будучи заданным, этот атрибут должен предшествовать атрибуту
'var'. Варианты значений атрибута
'encoding
':
'entity
' — (по умолчанию) будет произведено преобразование специальных HTML-символов в сущности;
'url
' — будет произведено т.н. %-преобразование, то есть пригодное для указания в строке URL;
**'none
' — не будет производиться никаких преобразований.
'flastmod
' — выводит дату последней модификации файла в определенном с помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.
'fsize
' — выводит размер файла в определенном с помощью sizefmt формате. Допустимые атрибуты:
*'file
' — определяет путь к файлу, относительно сканируемого документа;
*'virtual
' — определяет стандартный кодированный URL, относительно сканируемого документа, или, при наличии в начале слеша (/) — относительно корня документов узла.
'include
' — включает текст другого документа или файла в сканируемый файл. К включаемому файлу применяются все установленные правила ограничения доступа. Если для каталога, из которого включается файл, установлена опция IncludesNOEXEC, и включение данного документа привело бы к запуску программы, то документ не включается, и выводится сообщение об ошибке. CGI сценарии вызываются, как обычно с помощью URL, который может содержать кодированную строку запроса (query string). Положение файла указывается с помощью атрибутов:
* 'file
' — указывает путь, относительно сканируемого документа; путь не может содержать ../ и не может быть абсолютным путём; всегда предпочтительнее использовать атрибут virtual;
* 'virtual
' — содержит кодированный URL, относительный или абсолютный; URL не может содержать имя протокола или имя хоста, и может содержать строку запроса.
Условные операторы
Базовыми элементами контроля являются: <pre> <!–#if expr=«test_condition» –> <!–#elif expr=«test_condition» –> <!–#else –> <!–#endif –> </pre> Элементы elif и else являются необязательными.
Элемент endif заканчивает элемент if и является обязательным.
test_condition может быть одним из следующих:
*string
— истинно, если string не пуста;
*string1 = string2
*string1 != string2
*string1 < string2
*string1 ⇐ string2
*string1 > string2
*string1 >= string2
*всё вышеперечисленное истинно, если выполняется условие сравнения;
*string1 ~ string2
— истинно, если string1 содержит в себе string2;
*string1 ~= /string2/
— истинно, если string1 содержит в себе string2, а string2 — регулярное выражение Unix (см. ниже).
Если string2 имеет форму /string/
, то тогда она интерпретируется, как регулярное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;(см. Регулярные выражения)<br />
(test_condition)
— истинно, если test_condition истинно;<br />
! test_condition
— истинно, если test_condition ложно;<br />
test_condition1 && test_condition2
— истинно, если как test_condition1, так и test_condition2 истинны;<br />
test_condition1 || test_condition2
— истинно, если хотя бы test_condition1 или test_condition2 истинно.<br />
«=« и »!=« имеют больший приоритет, чем »&&» и «||», а «!» имеет наивысший приоритет.
Все, что не распознается, как переменная, считается строкой. Если строка имеет пробелы или символы табуляции, то её надо заключать в кавычки.<br />
О чём стоит помнить, так это о том, что лучше не использовать SSI-команды при создании страниц в редакторах типа Front Page — они их обычно не понимают и выкидывают, и о том, что одну SSI-команду нельзя вызвать из другой (как нельзя вызвать SSI-команду из скрипта, и скрипт из скрипта)
.
Примеры
Задание сообщения обработчика ошибок
<pre> <!–#config errmsg=«[При открытии страницы произошла ошибка. Пожалуйста, сообщите об этом владельцу сайта.]» –> </pre>
Задание формата вывода даты и времени
<pre> <!–#config timefmt=«%d/%m/%y» –> Выведет: 03/07/06 <!–#config timefmt=«%d/%m/%Y, %H:%M:%S» –> Выведет: 03/07/2006, 20:16:33 </pre>
Задание переменных
<pre> http:<!–#echo var=«HTTP_HOST»–><!–#echo var=«DOCUMENT_URI»–> Выведет: http://ru.wikipedia.org/w/index.php?title=SSI_(программирование) </pre> === Вставка даты модификации файла === <pre> <!–#flastmod file=«file.html»–> </pre> === Вставка содержимого файла === <pre> <!–#include file=«footer.html»–> <!–#include virtual=«header.asp»–> <!–#include virtual=«/right.links.txt»–> </pre> === Проверка условия === <pre> <!–#if expr=«test_condition»–> <!–#elif expr=«test_condition»–> <!–#else–> <!–#endif–> </pre> Веб-программирование