.: SSI (Server Side Include)
Назначение
SSI (Server Side Include - включения на стороне сервера)
представляет собой механизм включения интерпретируемых сервером команд в тело
HTML-документов. Разбор и интерпретация производится "на лету" в момент
обращения посетителя за документом. Тех же (и гораздо больших) результатов можно
добиться с помощью CGI, но это увеличит нагрузку на сервер (на каждый запрос
придется запускать отдельный процесс) и может привести к проблемам с
безопасностью. Впрочем, необходимость разбора HTML также увеличивает нагрузку на
сервер (но меньше, чем CGI). Команды SSI cgi и exec позволяют запускать
произвольные программы аналогично механизму CGI, подвергая риску безопасность
сервера, но их выполнение администратор сервера может запретить отдельно. Иногда
хостинговая компания запрещает клиентам использовать свои CGI программы, не
оставляя выбора. Возможностей SSI достаточно для вставки навигационной панели
или условной генерации кода страницы. Для сложных задач рекомендуется
использование PHP. CGI имеет смысл
использовать в редких случаях (унаследованный софт, права доступа).
Описание дается для http-сервера Apache (XSSI).
Настройка сервера.
Обработка SSI ведется модулем mod_include. Не все документы
интерпретируются. Прежде всего необходимо определиться какой суффикс
(расширение) будут иметь файлы с SSI-командами. Обычным суффиксом является
".shtml". Необходимо сказать серверу, что файлы с таким суффиксом представляют
собой документы на HTML и что их надо интерпретировать:
AddType text/html .shtml
AddHandler server-parsed .shtml
В последней версии Apache данные директивы могут быть на любом
уровне - уровне сервера, виртуального хоста или директории/.htaccess. Можно
использовать обычный суффикс ".html", но тогда интерпретироваться будут все
документы. Директория, файлы из которой необходимо интерпретировать, также
должна иметь опции Includes или IncludesNOEXEC (запрещены команды
exec и cgi). Ошибки интерпретации записываются в обычный журнал ошибок.
Директива XBitHack (на уровне сервера, виртуального хоста или
директории/.htaccess) позволяет управлять интерпретацией html документов
(text/html):
- on (если установлены права исполнения для владельца, то интерпретировать)
- off (по умолчанию; не интерпретировать)
- full (если установлено право на исполнение для владельца, то
интерпретировать; если установлено право на исполнение для группы, то
устанавливать HTTP заголовок Last-modified исходя из времени последней
модификации файла)
Синтаксис команд.
Команды оформляются как
SGML-комментарии: <!--#команда{ атрибут="значение"} --> Обратите
внимание на отсутствие пробела перед "#" и его наличие перед "-->" (сол,
фасол пишется с мягким знаком...).
Внутри строки, заключенной в кавычки в теле директивы SSI,
происходит подстановка значения переменной окружения вместо имени переменной,
предваренной знаком "$" (аналогично sh). Также можно использовать фигурные
скобки.
Команды:
- config - задает параметры интерпретатора и имеет атрибуты:
- errmsg (значение атрибута определяет текст сообщения, посылаемый
клиенту в случае ошибки разбора SSI)
- sizefmt (значение атрибута определяет формат выдачи размера
файла)
- bytes (точный размер в байтах)
- abbrev (округленный размер в Kb или Mb)
- timefmt (значение атрибута задает строку, используемую
strftime(3) при выдаче даты)
- echo имеет атрибуты:
- var, значением которого является имя переменной окружения;
значение данной переменной будет вставлено в документ; если переменная не
установлена, то будет вставлена строка "(none)"; при выводе значений
дат используется формат, установленный атрибутом timefmt команды
config
- encode определяет способ кодирования специальных символов
(устанавливать до var)
- none (как есть)
- url (как URI - через %)
- exec позволяет выполнить команду или CGI скрипт (если не
установлено IncludesNOEXEC); может иметь атрибуты:
- cgi - относительный URI CGI скрипта (если не начинается с "/", то
относительно текущего документа), должен лежать в допустимом месте (каталог
указан в ScriptAlias или Options ExecCGI). PATH_INFO и
QUERY_STRING наследуется из текущего документа (а не задаются в URI).
Include-переменные (установленные командой set) добавляются к стандартному
CGI-окружению. Если скрипт возвращает заголовок Location:, то он
преобразуется в HTML якорь ("<a name=...>). Действие "Options
NoExec" отменяется. Аналогичного эффекта можно добиться с помощью
include virtual.
- cmd - указанная команда выполняется, используя /bin/sh.
Include-переменные передаются в команду. Действие "Options NoExec"
отменяется.
- fsize вставляет размер файла; имя файла определяется атрибутами:
- file - имя файла (м.б. относительно текущего документа)
- virtual - URI (м.б. относительно текущего документа)
- flastmode вставляет время последней модификации файла; имя файла
определяется атрибутами:
- file - имя файла (м.б. относительно текущего документа)
- virtual - URI (м.б. относительно текущего документа)
- include вставляет текст другого документа или файла (могут быть
вложенные include). Вставляемый файл контролируется на право доступа обычным
образом. Если в текущей директории действует опция IncludesNOEXEC, а включение
документа инициировало бы выполнение программы, то документ не вставляется.
Иначе CGI вызывается как обычно с указанием URI и (м.б.) строки запроса. Имя
файла определяется атрибутами:
- file - только относительно текущего документа (никаких абсолютных
имен или имен, начинающихся с ../)
- virtual - URI. Не может содержать схему или имя хоста. М.б.
относительно текущего документа. Может содержать строку запроса. Таким
способом можно в т.ч. запускать CGI-программы.
- printenv вставляет все определенные переменные окружения и их
значения; атрибутов нет
- set устанавливает значение переменной окружения; атрибуты:
- var - имя переменной
- value - устанавливаемое значение переменной
- Команды условного выполнения:
- <!--#if expr="условие" -->
- <!--#elif expr="условие" -->
- <!--#else -->
- <!--#endif -->
Тестовые условия (если строка2 заключена в слеши, то она
интерпретируется как регулярное выражение; "=" и "!=" имеет больший приоритет,
чем "&&" и "||"; "!" - еще больший; все, что не является переменной или
оператором, рассматривается как строка; строки могут быть заключены в апострофы;
если строка содержит пробелы, то она должна быть заключена в апострофы;
две строки рядом конкатенируются через пробел):
- строка (истина, если строка не пуста)
- строка1 = строка2
- строка1 != строка2
- строка1 < строка2
- строка1 <= строка2
- строка1 > строка2
- строка1 >= строка2
- (условие)
- ! условие
- условие1 && условие2
- условие1 || условие2
Например: <--#if
expr="\"$DOCUMENT_URI\" = /.*squid\.html/" -->
Переменные окружения.
В дополнение к стандарту CGI устанавливаются следующие переменные
окружения:
- DATE_GMT
- DATE_LOCAL
- DOCUMENT_NAME (имя файла без имени директории)
- DOCUMENT_URI (URI запрошенного - не текущего! - документа)
- LAST_MODIFIED
У меня получается такой список (printenv):
- переменные окружения сервера
- DOCUMENT_ROOT=директория-с-документами
- HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
image/png, */*
- HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8
- HTTP_ACCEPT_ENCODING=gzip
- HTTP_ACCEPT_LANGUAGE=ru, en
- HTTP_CACHE_CONTROL=max-age=864000
- HTTP_CONNECTION=keep-alive
- HTTP_HOST=www.bog.pp.ru
- HTTP_IF_MODIFIED_SINCE=Wed, 21 Mar 2001 19:25:26 GMT; length=1696
- HTTP_PRAGMA=no-cache
- HTTP_USER_AGENT=Mozilla/4.73 [ru] (X11; U; Linux 2.2.16-3 i686)
- PATH=...
- REMOTE_ADDR=195.161.72.8 (в данном случае proxy сервер)
- REMOTE_HOST=newcache.deol.ru (в данном случае proxy сервер)
- REMOTE_PORT=56712
- SCRIPT_FILENAME=абсолютное-имя-файла
- SERVER_ADDR=195.161.72.12
- SERVER_ADMIN=почтовый-ящик
- SERVER_NAME=www.bog.pp.ru
- SERVER_PORT=80
- SERVER_SIGNATURE=<ADDRESS>Apache/1.3.12 Server at www.bog.pp.ru
Port 80</ADDRESS>
- SERVER_SOFTWARE=Apache/1.3.12 (Unix) PHP/4.0.4pl1 rus/PL29.4
- переменные CGI
- GATEWAY_INTERFACE=CGI/1.1
- SERVER_PROTOCOL=HTTP/1.0
- REQUEST_METHOD=GET
- QUERY_STRING=
- REQUEST_URI=локальная-часть-URI
- SCRIPT_NAME=локальная-часть-URI
- переменные SSI (времена в формате, установленном timefmt)
- DATE_LOCAL=20010321
- DATE_GMT=20010321
- LAST_MODIFIED=20010321
- DOCUMENT_URI=URI запрошенного - не текущего! - документа
- DOCUMENT_PATH_INFO= (кусок URI после ";"?)
- USER_NAME=владелец-файла
- DOCUMENT_NAME=имя файла без имени директории
- заголовки от proxy
- HTTP_VIA=1.0 newcache.deol.ru:3128 (Squid/2.3.STABLE4)
- HTTP_X_FORWARDED_FOR=195.161.73.152
- переменные перекодировщика русского от RussianApache
- CHARSET=koi8-r
- CHARSET_DETERMINED_BY=UserAgent
- CHARSET_HTTP_METHOD=http://
- CHARSET_SERVER_NAME=www.bog.pp.ru:80
- CHARSET_SERVER_PORT=80
- SOURCE_CHARSET=koi8-r
- переменные счетчика
- URL_COUNT=2
- URL_COUNT_DB=абсолютное-имя-файла
- URL_COUNT_DINDEX=index.php index.html index.htm index.shtml
- URL_COUNT_FACEDIR=абсолютное-имя-директории
- URL_COUNT_RESET=Wednesday, 21-Mar-01 22:25:26 MSK
- URL_COUNT_TIMEFMT=%A, %d-%b-%y %T %Z
- VRL_COVNT=II
Практика.
Использование SSI для стандартного оформления страницы оформляемая страница SSI.html
<!--#set var="title" value="SSI (Server Side Include)" -->
<!--#include file="zagolovok.html" -->
<!--#include file="menu.html" -->
... текст ...
<!--#include file="menu.html" -->
<!--#include file="signature.html" -->
zagolovok.html
<!--#config timefmt="%Y%m%d" -->
<html lang="ru">
<head>
<title>Bog BOS: sitelife: <!--#echo var="title" --></title>
<style>
...
</style>
<meta name="Author" content="Sergey E Bogomolov">
<!--#if expr="\"$keywords\" != \"\"" -->
<meta name="Keywords" content="<!--#echo var="keywords" -->"><!--#endif -->
<meta http-equiv="Content-Type" content="text/html">
</head>
<body alink="#ff0000" bgcolor="#ffffff" link="#0000ff"
text="#000000" vlink="#0000aa">
menu.html
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td bgcolor="#0086b2">
<table>
<tr bgcolor="#ffffff">
<td><a href="http://www.bog.pp.ru<!--#echo var="DOCUMENT_URI" -->">auto </a></td>
<td><a href="http://koi8.bog.pp.ru<!--#echo var="DOCUMENT_URI" -->">koi </a></td>
...
</tr>
</table>
</td>
<td bgcolor="#0086b2" align="middle"><p class="h2">Bog BOS: sitelife:
<!--#if expr="\"$title\" != \"\"" --><!--#echo var="title" --><!--#endif -->
</p></td>
...
</tr>
</table>
<!--#if expr="\"$menu\" != \"yes\"" -->
<p align="right">Последнее изменение файла: <!--#echo var="LAST_MODIFIED" --></p>
<!--#endif -->
<!--#set var="menu" value="yes" -->
signature.html
<hr>
</body></html>
Copyright © 1996-2002 Sergey E. Bogomolov; www.bog.pp.ru
|