SSI 

Если вы прогуляетесь по страницам этого сайта, вы увидите, что меняются только тексты страниц и их заголовки - а всё остальное - детали оформления, меню навигации, форма для комментариев и строка поиска - всё это остаётся неизменным.

На этом сайте около сотни различных страниц и все они оформлены одинаково. Но посмотрите, что пришлось бы сделать, если бы было нужно, например, изменить вид меню навигации. Если всё пришлось бы делать "по старинке", было бы нужно открыть каждый из сотни файлов, заменить один фрагмент HTML-кода другим и затем закачать изменённые страницы на сайт. Однако на этом сайте "всего лишь" несколько мегабайт текста. А что пришлось бы делать, если размер сайта измерялся бы сотнями мегабайт?

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

Между тем решение проблемы давно уже было - правда клиентам бесплатных хостингов оно не было доступно. На Webservis.ru оно есть и зовут его "SSI" - "Server Side Includes". Перевести это можно, в принципе, как «сборкой страниц занимается вебсервер».

Назначение технологии SSI - указать вебсерверу, какой фрагмент взять, и куда его приткнуть, прежде чем выдать его посетителю страницы. Так, ни на одной моей странице нет кода, который отвечает за показывание баннера - а вы его видите, и не один, а даже два. Просто на каждой из моих страниц вверху и внизу есть фрагмент <!--#include virtual="fragments/banner.html"-->. Когда ваш браузер попросил у вебсервера Webservis.ru страницу, на которой вы сейчас находитесь, сервер обнаружил эту метку в тексте страницы. В ней содержится указание взять из подкаталога Fragments файл banner.html и вставить его вместо этой метки. Поэтому если мне вдруг когда нибудь захочется поменять баннер, мне будет достаточно изменить один только файл banner.html - а менять все страницы не понадобится совершенно.

Ещё одно возможное применение SSI - с его помощью можно выводить различную информацию о странице. Так, команда <!--#flastmod file="creating-ssi.shtml"--> вставит в текст страницы число, когда эта страница последний раз обновлялась. Точно так же можно выводить название этой страницы и путь к ней, её размер и много чего ещё.

Но давайте по порядку. Итак, как вы могли увидеть, SSI-команды вставляются в текст страниц, как обычные комментарии, внутри тэга <!--#SSI-команда="параметры" -->. Единственное отличие от простого комментария - в начале должен обязательно присутствовать символ "#".

Вот список основных SSI-команд:

#include file

Вставляет файл из той же самой папки. Так, <!--#include file="file.txt"> укажет серверу взять файл file.txt и вставить его содержимое в страницу

#include virtual

В отличие от предыдущей команды эта позволяет вставлять файлы из других папок. Так, <!--#include virtual="kakoj/nibud/file.txt"> укажет серверу взять файл file.txt из подпапки nibud папки kakoj. Как видите, здесь используются относительные пути к файлам.

#fsize file

Выводит размер файла (формат числа указывается командой config sizefmt). Так <!--#fsize file="creating-ssi.shtml"> выведет значение размера cтраницы, на которой вы сейчас находитесь - 26,576 байт.

#flastmod file

Выводит дату последнего обновления файла (формат числа указывается с помощью директивы config datefmt).

#exec cmd

Запускает указанную программу и вставляет выведенные ей строки в текст страницы. Например, <!--#exec cmd="date"-->

#exec cgi

Запускает указанный скрипт и вставляет результат его работы в страницу. Но лучше пользуйтесь для этого директивой include virtual (exec cgi может иногда не работать). Так, скрипт, который каждый раз выводит новый пример запроса для поиска в правом верхнем углу этой страницы, вызывается у меня командой <!--#include virtual="/cgi-bin/random-example.cgi"-->. Перезагрузите эту страницу, и эта фраза - "установка Perl" , вставляемая скриптом random-example.cgi через SSI-команду include virtual сменится другой.

#config errmsg

Вы, наверное, нередко встречали фразу "[an error occurred while processing this directive]" на некоторых недоделанных или неправильно работающих сайтах. Эту фразу вебсервер выводит тогда, когда он не может запустить скрипт, если в том содержатся ашипки или очепятки или же этого скрипта просто не существует. Команда config errmsg позволяет заменить эту непонятную фразу на что-нибудь более вменяемое. Советую вставлять первой строкой во все страницы, которые вы создаёте, SSI-команду <!--#config errmsg="[При открытии страницы произошла ошибка. Пожалуйста, сообщите об этом хозяину сайта.]"-->

#config timefmt

Указывает серверу, в каком формате выдавать дату командой flastmod. По умолчанию это что-то вроде "Sunday, 10-Sep-2000 17:58:59 Московское время (лето)". Вам же может захотеться получить дату в виде день/месяц/год. Для этого с командой 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
%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

Таким образом, команда <!--#config timefmt="%d/%m/%Y, %H:%M:%S"--> укажет серверу выдавать время последнего обновления файла в таком формате - 21/11/2000, 00:42:33, а команда <!--#config timefmt="%d/%m/%y"--> - в таком - 21/11/00.

#config sizefmt

Изменяет формат вывода значения размера файла. <!--#config sizefmt="abbrev"--> заставляет выводить размер файла в килобайтах ( 26k), а <!--#config sizefmt="bytes"--> - в байтах (26,576)
Обратите внимание на то, что команды #config sizefmt и #config timefmt влияют на все связанные с ними SSI-команды от того места, откуда они были вызваны и до самого конца страницы. Поэтому каждый вызов команд #flastmod и #fsize снабжайте своей командой #config - так проще и спокойнее.

#printenv

Выводит список так называемых "переменных окружения" ("environment variables") с их значениями. В их числе переменные:
 
DOCUMENT_ROOT (название основной папки для вебстраниц на сервере, обычно ваша папка public_html и путь к ней),
HTTP_USER_AGENT (название браузера, которым пользуется посетитель),
REMOTE_ADDR (IP-адрес посетителя),
REMOTE_HOST (адрес посетителя в нормальной форме - например, d150.p7.col.ru)
SERVER_ADDR (IP-адрес вашего сайта)
SERVER_NAME и HTTP_HOST (адрес сервера, типа userguide.webservis.ru),
DOCUMENT_URI, REQUEST_URI и SCRIPT_NAME (запрошенная вами страница, типа /examples/mysqlexample.shtml. Сочетание SERVER_NAME и REQUEST_URI даёт привычный вам адрес страницы),
DOCUMENT_NAME (только название файла),
SCRIPT_FILENAME (полный путь к вебстранице на сервере. Например /home/home-webservis/public_html/ и так далее),
SERVER_SOFTWARE (название сервера, например, Apache/1.3.12 (Unix))
SERVER_ADMIN (почтовый адрес владельца сервера, указанный при установке. Когда вы регистрируетесь, имя созданного для вас на Webservis.ru ящика прописывается там),
DATE_LOCAL (сегодняшниее время и дата в вашем часовом поясе),
DATE_GMT (то же, но по Гринвичу),
LAST_MODIFIED (дата и время последнего обновления страницы)
 
Никаких параметров у этой SSI-команды нет. Просто <!--#printenv -->.
 
То, что выводит эта команда, когда её обрабатывает сервер Webservis.ru, работающий на Unix и вебсервер, который, быть может, вам захочется установить для тестирования сайта на ваш домашний компьютер под Windows, отличается на добрых две трети. Учитывайте это!

#echo var

Выводит знчение определённой переменной. Например, http://<!--#echo var="HTTP_HOST"--><!--#echo var="DOCUMENT_URI"--> выведет адрес этой страницы - http://userguide.webservis.ru/creating-ssi.shtml.

#set var value

Присваивает новое значение переменной. Например, <!--#set var="SERVER_ADMIN" value="новый@адрес.ru"-->

#if, #elif, #else и #endif

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

 
Условие - это либо строка, которая является истинной, если она непустая, или набор операторов сравнения строк. Операторами могут быть =, !=, <, <=, > и >. Если вторая строка заключена в слэши ("/"), то условие истинно, если в первой строке встречается хоть одно вхождение второй строки. Можно объединять несколько операторов сравнения с помощью операторов && ("AND") и || ("OR"). Для группирования условий используются скобки. Пример:
 
Вы пользуетесь браузером
<!--#if expr="$HTTP_USER_AGENT=/MSIE/ ||
                                $HTTP_USER_AGENT=/Microsoft/" -->
Microsoft Internet Explorer
<!--#elif expr="$HTTP_USER_AGENT=/Opera/" -->
Opera
<!--#elif expr="$HTTP_USER_AGENT=/Mozilla/" -->
Netscape Navigator
<!--#else -->
неизвестной мне марки
<!--#endif -->

 
Такой фагмент выведет:
 
Вы пользуетесь браузером Microsoft Internet Explorer

Ну что, насколько меньше этот фрагмент скрипта на Java, который делает то же самое? А главное это то, что всеми этими условиями занимается сервер, а посетителю страницы выдаётся готовый результат - и он, в отличие от случая с JavaScript, когда он может посмотреть код скрипта, даже не знает, что что-то делалось со страницей.

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

Единственное, о чём стоит помнить, так это о том, что лучше не использовать SSI-команды при создании страниц в редакторах типа Front Page - они их обычно не понимают и выкидывают, и о том, что одну SSI-команду нельзя вызвать из другой (как нельзя вызвать SSI-команду из скрипта, и (скажу, забегая вперёд) скрипт из скрипта).

Работу страниц с SSI-командами невозможно проверить, открыв их в вашем браузере просто с диска компьютера. SSI-команды понимает только вебсервер - поэтому для проверки их работоспособности вам придётся выгрузить их на Webservis.ru или же установить вебсервер для тестирования сайта на свой домашний компьютер.