SSI - переменные и настройки
Основным, простейшим, но в то же время чрезвычайно мощным инструментом поддержки больших наборов документов является SSI (Server-Side Includes - включения на стороне сервера). Если кто-то из вас знает Си, то он быстро поймет, что SSI чрезвычайно похож на макроязык. С помощью SSI можно не только в зависимости от некоторых условий выводить определенные части документа, не только формировать документ из заранее определенных кусочков, но и вставлять результат работы некоторого CGI сценария или программы прямо в документ. Не смотря на порядок слов в заголовке (что, когда и как) мы сначала расскажем "как", а потом уже перейдем к "когда". В стандартном дистрибутиве Apache есть модуль mod_include. Начиная с версии 1.2 он имеет расширенное количество директив и называется - XSSI (eXtended SSI). По умолчанию он включен в компиляцию.
Включение механизма Server-Side Includes
Любой документ, у которого будет установлен обработчик "server-parsed" будет сканироваться этим модулем, если включена опция "Includes". Если вы имеете малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующее: AddType text/html .shtml AddHandler server-parsed .shtml
и устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в файле конфигурации указать: AddHandler server-parsed .html
И не забудьте включить в опции директории узла опцию Includes: Options +Includes
Конечно в этой строке могут быть и другие нужные вам опции.
Базовые директивы
Директивы SSI включаются в HTML документ в виде комментариев (это не мешает вам использовать обычные комментарии). Синтакс команд имеет следующий вид:
Очень часто значение помещается в двойные кавычки. Некоторые команды позволяют иметь только одну пару атрибут-значение. Обратите внимание, что заключительная часть комментария (-->) должна отделяться от директивы пробелом, иначе она будет воспринята, как ее часть.
Рассмотрим определенные в Apache элементы SSI:
config - контролирует различные аспекты сканирования. Его атрибутами могут быть:
errmsg - устанавливает сообщение, выводящееся при возникновении ошибки; в большинстве случаев целесообразно установить в пустую строку;
sizefmt - устанавливает формат, в котором будет выводиться размер файла. Формат соответствует передаваемому библиотечной функции strftime;
timefmt - устанавливает формат, в котором будет выводиться дата.
echo - выводит значение установленной переменной SSI. Допустимым атрибутом является var.
fsize - выводит размер файла в определенном с помощью sizefmt формате. Допустимые атрибуты:
file - определяет путь к файлу, относительно сканируемого документа;
virtual - определяет стандартный кодированный URL, относительно сканируемого документа, или, при наличии в начале слеша (/) - относительно корня документов узла.
flastmod - выводит дату последней модификации файла в определенном с помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.
include - включает текст другого документа или файла в сканируемый файл. К включаемому файлу применяются все установленные правила ограничения доступа. Если для каталога, из которого включается файл, установлена опция IncludesNOEXEC, и включение данного документа привело бы к запуску программы, то документ не включается, и выводится сообщение об ошибке. CGI сценарии вызываются, как обычно с помощью URL, который может содержать кодированную строку запроса (query string). Положение файла указывается с помощью атрибутов:
file - указывает путь, относительно сканируемого документа; путь не может содержать ../ и не может быть абсолютным путем; всегда предпочтительнее использовать атрибут virtual; virtual - содержит кодированный URL, относительный или абсолютный; URL не может содержать имя протокола или имя хоста, и может содержать строку запроса.
printenv - выводит содержимое переменных окружения. Вызывается без параметров.
set - устанавливает значение переменной. Ее атрибутами являются var, определяющий имя переменной, и value, определяющий ее значение.
Переменные включения
В дополнение к стандартным окружения CGI, модуль SSI делает доступными для директив и условий, а также для вызываемых через SSI сценариев следующие переменные: DATE_GMT - текущее время по Гринвичу; DATE_LOCAL - текущее локальное (для сервера) время; DOCUMENT_NAME - имя файла (без каталогов) документа, запрошенного пользователем; DOCUMENT_URI - декодированный URL запрошенного пользователем документа; LAST_MODIFIED - дата последней модификации документа, запрошенного пользователем. То есть во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.
Подстановка переменных
Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI директив. В этих случаях знак доллара можно вставить, предварив его слешом:
Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:
В результате такого присвоения переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.
Условные операторы
Базовыми элементами контроля являются:
Элементы elif и else являются необязательными.
Элемент endif заканчивает элемент if и является обязательным.
test_condition может быть одним из следующих:
string - истинно, если string не пуста; string1 = string2 string1 != string2 string1 < string2 string1 <= string2 string1 > string2 string1 >= string2
истинно, если выполняется условие сравнения. Если string2 имеет форму /string/, то тогда она интерпретируется, как регулятное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;
( test_condition ) - истинно, если test_condition истинно; ! test_condition - истинно, если test_condition ложно; test_condition1 && test_condition2 - истинно, если как test_condition1, так и test_condition2 истинны; test_condition1 || test_condition2 - истинно, если хотя бы test_condition1 или test_condition2 истинно.
"=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!" имеет наивысший приоритет.
Все, что не распознается, как переменная, считается строкой. Если строка имеет пробелы или символы табуляции, то ее надо заключать в кавычки.
Практическое использование SSI
Первым распространенным применением SSI является внедрение в документ некоего динамического куска разметки. Хрестоматийными примерами могут служить счетчики посещений, цитаты или баннеры рекламных сетей. В любом случае, будь то строка текста или целая таблица, вставка производится с помощью директивы include, помещаемой в то место, куда должен быть вставлен кусок разметки:
<html> <body> Документ с баннером внизу страницы </body> </html>
Программа или сценарий CGI, вставляемая с помощью SSI, ничем не отличается от стандартной CGI программы, за исключением того, что должен выдаваться не целый документ, а только кусок разметки.
Вот текст упомянутого выше сценария:
#!/usr/local/bin/perl $login=$ENV{"QUERY_STRING"}; print "Content-type: text/html\n\n"; ($IP)=($ENV{"REMOTE_ADDR"}=~s/\.//g); srand($$+$IP+time); $seed=int rand(10000000); print "<a href=\"http://www.reklama.ru/cgi-bin/href/$login?$seed\">\n"; print "<img src=\"http://www.reklama.ru/cgi-bin/banner/$login?$seed\" width=468 height=60 border=0>\n"; print "</a>\n";
Как видно из примера даже во включаемых сценариях необходимо выводить HTTP заголовок.
В результате сканирования нашего простейшего документа пользователю будет возвращен примерно (с точностью до случайной величины) следующий документ:
<html> <body> Документ с баннером внизу страницы <a href="http://www.reklama.ru/cgi-bin/href/webclub?348593"> <img src="http://www.reklama.ru/cgi-bin/banner/webclub?348593" width=468 height=60 border=0> </a> </body> </html>
Вторым распространенным применением SSI является формирование страницы из шаблона. В простейшем случае - это документ в начало и конец которого вставляются шапка и концевик:
<html> <head> <title>Test Page</title> </head> Тестовая страница Некий текст </body> </html>
Вставляемые блоки не обязательно должны быть законченными, например, header.html может заканчиваться тэгом , а global_menu.html или footer.html начинаться с тэга . Таким образом, какими бы навороченными не были шапка и концевик документа, редактируемый документ выглядит чрезвычайно просто, и его легко редактировать.
Только используя SSI вы можете в считанные минуты полностью изменить внешний вид или обновить систему навигации на узле, имеющем сотни или тысячи документов, и так, что это пройдет безболезненно для пользователей узла, т.к. вам только потребуется заменить несколько файлов, а остальное за вас сделает сервер.
В связи со всем вышесказанным рождается одно правило: желательно смысловую часть документа строить так, чтобы она никак не полагалась на содержимое шапок и концевиков. В этом случае вы легко сможете перейти с табличной организации страниц на последовательную или на слоевую.