|
Bog BOS: sitelife: SSI (Server Side Include)
|
Последнее изменение файла: 2007.06.09
Скопировано с www.bog.pp.ru: 2024.11.23
Bog BOS: sitelife: SSI (Server Side Include)
SSI (Server Side Include - включения на стороне
сервера) представляет собой механизм включения интерпретируемых
сервером команд в тело HTML-документов. Разбор и интерпретация производится
"на лету" в момент обращения посетителя за документом. Тех же (и гораздо
больших) результатов
можно добиться с помощью CGI, но это увеличит нагрузку на сервер
(на каждый запрос придется запускать отдельный процесс) и может
привести к проблемам с безопасностью. Впрочем, необходимость разбора
HTML также увеличивает нагрузку на сервер (но меньше, чем CGI).
Команды SSI cgi и exec позволяют запускать произвольные программы аналогично
механизму CGI, подвергая риску безопасность сервера, но их выполнение
администратор сервера может запретить отдельно. Иногда хостинговая компания
запрещает клиентам использовать свои CGI программы, не оставляя выбора.
Возможностей SSI достаточно для вставки навигационной панели или условной генерации
кода страницы. Для сложных задач рекомендуется использование
PHP. CGI имеет смысл использовать в редких
случаях (унаследованный софт, права доступа).
Описание дается для http-сервера
Apache и Apache 2 (XSSI).
Обработка SSI ведется модулем mod_include. Не все документы
интерпретируются. Прежде всего необходимо определиться какой суффикс
(расширение) будут иметь файлы с SSI-командами. Обычным суффиксом является
".shtml". Необходимо сказать серверу, что файлы с таким суффиксом
представляют собой документы на HTML и что их надо интерпретировать:
AddType text/html .shtml
AddHandler server-parsed .shtml
В версии Apache 1.3 данные директивы могут быть
на любом уровне - уровне сервера, виртуального хоста или директории/.htaccess.
В версии Apache 2 модуль include реализован как выходной фильтр, а не обработчик
(для совместимости обработчик server-parsed также задействует фильтр INCLUDES;
фильтр INCLUDES также включается для документов типа text/x-server-parsed-html
и text/x-server-parsed-html3; результат получает тип text/html; для приёма
параметров необходимо позаботиться о AcceptPathInfo):
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Можно использовать обычный суффикс ".html", но тогда интерпретироваться
будут все документы.
Директория, файлы из которой необходимо интерпретировать, также должна
иметь опции Includes или IncludesNOEXEC (запрещены команды
exec и cgi). Ошибки интерпретации записываются в обычный журнал ошибок.
Директивы настройки сервера Apache 2:
- SV SSIEndTag строка ("-->"; замена тега окончания команды)
- SVDFLA SSIErrorMsg строка (замена стандартного сообщения об ошибке,
выдаваемая клиенту, например, "<!-- Error -->", чтобы клиент ничего не заметил)
- SV SSIStartTag строка ("<!--#"; замена тега начала команды)
- SVDFLA SSITimeFormat строка-формата (аналог "config timefmt" - см. ниже)
- SVDFLA SSIUndefinedEcho строка ("(none)"; строка будет выводиться при
попытке сделать echo для несуществующей переменной)
- SVDFLA XBitHack off | on | full
(позволяет управлять интерпретацией 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=...>).
Аналогичного эффекта можно добиться с помощью include virtual.
- cmd - указанная команда выполняется, используя /bin/sh.
Include-переменные передаются в команду.
- fsize вставляет размер файла; имя файла определяется атрибутами:
- file - имя файла (м.б. относительно текущего документа)
- virtual - URI (м.б. относительно текущего документа; выдаётся размер скрипта)
- flastmod вставляет время последней модификации файла; имя файла
определяется атрибутами:
- file - имя файла (м.б. относительно текущего документа)
- virtual - URI (м.б. относительно текущего документа)
- include вставляет текст другого документа или файла (могут
быть вложенные include). Вставляемый файл контролируется на право
доступа обычным образом. Если в текущей директории действует опция
IncludesNOEXEC, а включение документа инициировало бы выполнение
программы, то документ не вставляется. Иначе CGI вызывается как обычно
с указанием URI и (м.б.) строки запроса. Имя файла определяется атрибутами:
- file - только относительно текущего документа (никаких
абсолютных имен или имен, начинающихся с ../)
- virtual - URI. Не может содержать схему или имя хоста. М.б.
относительно текущего документа. Может содержать строку запроса.
Таким способом можно в т.ч. запускать CGI-программы.
- printenv вставляет все определенные
переменные окружения и их значения; атрибутов нет
- set устанавливает значение переменной окружения; атрибуты:
- var - имя переменной
- value - устанавливаемое значение переменной
- Команды условного выполнения:
- <!--#if expr="условие" -->
- <!--#elif expr="условие" -->
- <!--#else -->
- <!--#endif -->
Тестовые условия (если строка2 заключена в слеши, то она
интерпретируется как регулярное выражение (PCRE, включая установку локальных
переменных $1, ..., $9); "=" и "!=" имеет больший
приоритет, чем "&&" и "||"; "!" - еще больший; все, что не
является переменной или оператором, рассматривается как строка; строки
могут быть заключены в апострофы; если строка содержит пробелы, то она
должна быть заключена в апострофы; две строки рядом
конкатенируются через пробел):
- строка (истина, если строка не пуста)
- строка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
- QUERY_STRING_UNESCAPED (в описании наоборот говорится, что "escaped")
У меня получается такой список (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" -->
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/tr/REC-html40/loose.dtd">
<html lang="ru">
<head>
<title>Bog BOS: sitelife: <!--#echo var="title" --></title>
<style type="text/css">
...
</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="center"><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>
|
Bog BOS: sitelife: SSI (Server Side Include)
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru