Краткий справочник по командам SSI

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

Формат SSI-директив

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

 <!--#command param="value" -->

где

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

Подключение внешних файлов (#include)

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

 <!--#include virtual="/path/filename.shtml" -->
 <!--#include file="path/filename.shtml" -->

Основное различие между ними заключается в имени параметра, которое может быть либо virtual, либо file. В первом случае можно подключать странички, указывая их расположение относительно корня сайта, т.е. используя логический путь. А во-втором случае используется физическое местоположение файла на диске и путь может быть относительным.

Чаще всего используется режим virtual, т.к. позволяет достаточно легко поддерживать большие сайты, свободно добавляя новые разделы. Но в ряде случае может быть полезным и режим file, особенно если сайт не находится на отдельном домене.

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

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

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

 <!--#include virtual="/includes/header.shtml" -->
 
 <h1>О проекте</h1>
 <p>Этот абзац содержит собственно полезный текст странички.</p>
 
 <!--#include virtual="/includes/footer.shtml" -->

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

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
 <head>
 <title>Заголовок сайта</title>
 </head>
 
 <body>
 
 <!-- Заголовок сайта / начало -->
 <div id="header">
 <h1>Заголовок</h1>
 </div>
 <!-- Заголовок сайта / конец -->
 
 <!--#include virtual="/includes/menu.shtml" -->
 
 <!-- Основное содержание / начало -->
 <div id="content">

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

Использование переменных (#set, #echo)

В SSI можно определять свои переменные посредством команды "set".

 <!--#set var="variable_name" value="variable_value" -->

И в любой нужный момент их можно выводить на печать при помощи команды "echo".

 <!--#echo var="variable_name" -->

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

 <!--#set var="TITLE" value="О проекте" -->
 <!--#include virtual="/includes/header.shtml" -->
 
 <h1>О проекте</h1>
 <p>Этот абзац содержит собственно полезный текст странички.</p>
 
 <!--#include virtual="/includes/footer.shtml" -->

Я добавил одну первую строку, которая определяет переменную с именем TITLE, значение которой равно "О проекте". Разумеется, на разных страничках значение этой переменной будет различным. Но определить переменную мало, ее еще нужно использовать, и для этого мы модифицируем файл, который хранит шаблон заголовка страницы:

 ...
 
 <head>
 <title>Заголовок сайта - <!--#echo var="TITLE" --></title>
 </head>
 
 <body>
 
 ...

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

Стандартные переменные SSI

Кроме собственных можно использовать и ряд переменных, предопределенных в SSI. Ниже приведен список наиболее популярных переменных окружения и стандартных переменных SSI, которые можно использовать либо для вывода дополнительной информации, либо в условных операторах. Значения этим переменным присваивать не нужно - это делается автоматически самим web-сервером.

Имя переменной Краткое описание
HTTP_HOST Доменное имя хоста (web-cервера)
HTTP_USER_AGENT Строка описывающая программу просмотра, т.е. браузер
SERVER_ADDR IP-адреса хоста (web-cервера)
SERVER_SOFTWARE Программное обеспечение, запущенное на сервере
REMOTE_ADDR IP-адрес компьютера, с которого пришел запрос
LAST_MODIFIED Дата последней модификации страницы
DOCUMENT_URI Полный адрес к страничке, исключая доменное имя
DOCUMENT_NAME Имя файла, запрошенного пользователем
QUERY_STRING Содержимое строки запроса (то, что идет сразу за знаком ?)
DATE_GMT Текущее время по Гринвичу
DATE_LOCAL Текущее локальное время (на сервере)

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

 <!--#printenv -->

Смотри также