Номер телефона

Последнее обновление:

Общее описание технологии SSI

Введение

SSI - это Server Side Includes (технология динамической сборки сайта из его отдельных частей)

  • Что это такое
  • Настройка сервера

Страницы сайта, собранного по технологии SSI, загружаются в несколько раз быстрее, чем страницы сайта, созданного на базе той или иной динамической технологии или языка программирования (PHP, node.js, Python и т.д.). Однако, у SSI есть ограничение: составные части вебстраницы, из которых затем будет произведена сборка в единое целое, практически (за редким исключением) НЕ подвергаются и не могут подвергаться динамическим изменениям. Если же все-таки такие изменения необходимы, то придется вначале их осуществить при помощи того или иного языка программирования, а уже потом применить сборку по SSI. Правда, в таком случае уже смысла в этой технологии немного. А вот когда составные части сайта (например, шапка, футер, меню и т.д.) изменяются редко или вообще не меняются - вот тогда технология SSI окажет неоценимую услугу. Подробнее прочитать о SSI Вы можете в мануале.

Проще говоря, SSI наиболее целесообразна для применения на таких сайтах, которые являются статико-динамическими. Это сайты, которые содержат некие шаблоны (макеты) вебстраниц, причем составные части, которые используются для наполнения этих шаблонов, изменяются сервером достаточно редко. Впрочем, они могут изменяться, например, при помощи javascript (на стороне клиента). Однако, это потребует соответствующей архитектуры сайта, когда вначале загружается общий макет вебстраницы, основные ее JS-скрипты и иные ресурсы; а уже потом он "уточняется" посредством AJAX-запросов.

Сайт на технологии SSI может быть актуален и в том случае, когда есть желание немного сэкономить на стоимости хостинга, но при этом чтобы сайт собирался динамически, т.е. из составных, заранее заготовленных, частей. Как правило, услуги хостинга с SSI, но без других языков программирования (типа PHP, Python) стоят дешевле, иногда - даже гораздо дешевле. По той простой причине, что такие сайты существенно меньше нагружают сервер. При этом понятно, что вся "динамика" таких сайтов будет заключаться именно в динамической сборке. Тогда как, например, реализация системы комментирование на сайте (в том числе, и сторонней), загрузка рисунков на сайт и т.д. будет невыполнимой задачей.

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

Итак, что же это такое - технология SSI

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

Обилие компактных руководств в интернете для "простых пользователей", не спасает, а порой добавляет ещё больше неясности в силу недосказанности, равно как и грубых ошибок в примерах кода. А ряд вещей вообще толком нигде не описан.

Конечно, вроде как, есть мануалы, где более-менее описываются особенности применения технологиии SSI. Однако, во-первых, для начинающего разработчика эти мануалы все-таки несколько сложноваты. Во-вторых, даже и там кое-какие вещи изложены слишком уж компактно, поэтому что-то иной раз приходится додумывать уже самостоятельно.

По крайней мере, здесь вы найдёте практически исчерпывающий набор директив, атрибутов, операторов.

Описаны и переменные окружения (о полном наборе говорить не приходится, т.к. на каждом сервере он свой).

Кое-что расказывается о регулярных выражениях применительно к технологии SSI.

В отличие от подавляющего большинства "руководств" в интернете, данное руководство - это означает отсутствие недосказанностей.

Кое-что о терминологии. В разных справочниках используются как синонимы понятия «директива», «инструкция» и «функция».

Здесь использованы термины «директива» и «инструкция», которые не совсем синонимы. В конструкции вроде <!--#include file = "index.html" --> под директивой понимается ключевое слово, начинающееся со знака # (в данном примере — #include), а под инструкцией — всё выражение, находящееся между тэгами <!-- и —-> или комплекс директива-атрибут (в данном случае — #include file).

ЧТО ЭТО ТАКОЕ - более подробно

Итак, SSI (эс-эс-ай, Server Side Includes — включения на стороне сервера) — небольшой язык для сборки web-страницы «на лету» из составных частей, находящихся на сервере. В какой-то мере можно считать его альтернативой технологии фреймов, лишённой её печально известных недостатков.

Кроме фреймов, мы знаем и другие различные включения. Например, <link rel="stylesheet" href="файл.css" type="text/css"> или <script src="файл.js" type="text/javascript"></script>. Но все они выполняются браузером пользователя, и в исходном коде страницы мы видим ссылающиеся тэги. Включения же SSI происходят на самом сервере, и, просматривая в браузере исходный код, мы видим просто сплошной HTML-код страницы, как будто она и не собрана из лоскутков.

Кроме загрузки кусков HTML-кода, SSI делает и кое-что ещё, о чём мы скоро узнаем.

Существует две модификации SSI: XSSI (eXtended SSI) и SSI+. Внятных спецификаций этих стандартов нет. Здесь будет идти речь о XSSI.

НАСТРОЙКА СЕРВЕРА

Чтобы эта технология заработала, нужно указать нужные настройки в файле .htaccess, который должен находиться в корневой папке вашего сервера. Обычно по умолчанию какие-то настройки уже есть, например:

AddType text/html .txt AddHandler server-parsed .shtml Options +Includes

Рассмотрим по очереди.

AddType text/html .txt

Это означает, что куски кода, добавляемые в основной документ, должны быть сохранены в файлах с расширением .txt.

AddHandler server-parsed .shtml

Эта настройка сообщает о том, что расширение основного документа должно быть .shtml, иначе SSI не заработает.

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

AddType text/html .html, .htm, .txt AddHandler server-parsed .html, .htm, .shtml

То есть теперь в файл с обычным расширением .html или .htm можно вставить куски кода, написанные в файлах .html, .htm или .txt.

ПРИМЕЧАНИЕ 1

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

ПРИМЕЧАНИЕ 2

Включаемые файлы .html и .txt иногда работают немного по-разному.

И последняя строка:

Options +Includes

Она запускает заданные выше настройки.

Возможна и другая запускающая строка:

Options +ExecCGI

Это запустит не только вставки SSI, но и другие серверные скрипты, написанные на языках PHP, Perl и т.п.

Если вы опасаетесь что-то испортить в настройках файла .htaccess, данных по умолчанию, то не стирайте и не исправляйте их, а предварите знаком #, что превратит их в комментарии, а затем напишите свои:

#AddType text/html .txt
#AddHandler server-parsed .shtml
#Options +ExecCGI
AddType text/html .html, .htm, .txt
AddHandler server-parsed .html, .htm, .shtml
Options +Includes

Если решили поэкспериментировать и безнадёжно запутались — сотрите своё «творчество» и раскомментируйте настройки по умолчанию.

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

Если вместо включённого фрагмента на странице появится сообщение

[an error occurred while processing this directive]

(то есть «ошибка при выполнении директивы»), это означает, что запуск произошёл, но либо настройки недостаточны, либо есть ошибка в коде директивы SSI.

ШАГ 1


  • Синтаксис
  • Простая вставка (#include)

СИНТАКСИС

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

<!--#include file = "top1.html" -->

В общей форме это можно представить как

<!--#директива атрибут = "значение" -->

При использовании и назначении переменных может быть и такая, более развёрнутая форма (традиционно имена переменных пишутся заглавными буквами, хотя это и не обязательно):

<!--#директива атрибут = "ИМЯ_ПЕРЕМЕННОЙ" значение = "значение_переменной" -->

Собственно, это почти весь синтаксис. Несколько позже рассмотрим синтаксис условного оператора (единственного оператора в этом языке). Определённую тонкость представляет использование регулярных выражений и спецсимволов, и тут нужно быть очень внимательным.

Важное замечание о пробелах

В большинстве языков программирования наличие/отсутствие пробелов между тэгами, выражениями, операторами не учитывается. SSI в этом отношении ведёт себя странно: иногда вдруг на каком-то из серверов что-то не заработает из-за лишнего пробела или, наоборот, отсутствия такового.

Чтобы всё работало везде и всегда, соблюдайте следующее правило:

<!--#директива[пробел]атрибут[пробел]=[пробел]"значение"[пробел]-->.

Особенно вредным может быть отсутствие последнего пробела (перед закрытием комментария), и в то же время после открывающей скобки его не должно быть.

ПРОСТАЯ ВСТАВКА (#include)

Попробуем что-то сделать. Ну вот, например, такую страничку:


Это главная страница

Одним из вариантов того, для чего это вдруг власти столь озаботились – может являться, скорее всего, потребность в очередном распиле бюджетных средств. Понятно, что сейчас – санкции и всё такое, властным элементам и их «друзьям» спокойно не сидится на месте. Ну, а так, под шумок, распилить еще пару сотен миллионов рублей – ну, почему бы и нет, в самом деле. Конечно, речь идет не обо всех властных элементах Российской Федерации. А только, конечно же, о некоторых. Одним из вариантов того, для чего это вдруг власти столь озаботились – может являться, скорее всего, потребность в очередном распиле бюджетных средств. Понятно, что сейчас – санкции и всё такое, властным элементам и их «друзьям» спокойно не сидится на месте. Ну, а так, под шумок, распилить еще пару сотен миллионов рублей – ну, почему бы и нет, в самом деле. Конечно, речь идет не обо всех властных элементах Российской Федерации. А только, конечно же, о некоторых.


В ней можно выделить 3 элемента:

  1. Шапка
  2. Меню
  3. Содержание

Элементы 1 и 2 будут и на других страницах сайта. Их можно добавить на все страницы через технологию SSI.

Для ее использования необходимо, всего-навсего, написать html-коды, соответственно, шапки, меню и содержания, сохранив их в файлах, названных, например, так: shapka.txt, menu.txt, soderzshanie.txt. Если необходим футер (подвал), а также иные элементы - следует сделать и их.

А теперь заполним главную страницу:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>
Мой сайт - Главная страница</title>
<meta http-equiv=
"cont-Type" cont="text/html; charset=Windows-1251">
<link href=
"style.css" type=text/css rel=stylesheet>
</head>

<body>

<!--#include file = "shapka.txt" -->
<!--#include file = "menu.txt" -->

<table width="600" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<h1 align="center">Это главная страница</h1>
<p>
Одним из вариантов того, для чего это вдруг власти столь озаботились – может являться, скорее всего, потребность в очередном распиле бюджетных средств. Понятно, что сейчас – санкции и всё такое, властным элементам и их «друзьям» спокойно не сидится на месте. Ну, а так, под шумок, распилить еще пару сотен миллионов рублей – ну, почему бы и нет, в самом деле. Конечно, речь идет не обо всех властных элементах Российской Федерации. А только, конечно же, о некоторых. Одним из вариантов того, для чего это вдруг власти столь озаботились – может являться, скорее всего, потребность в очередном распиле бюджетных средств. Понятно, что сейчас – санкции и всё такое, властным элементам и их «друзьям» спокойно не сидится на месте. Ну, а так, под шумок, распилить еще пару сотен миллионов рублей – ну, почему бы и нет, в самом деле. Конечно, речь идет не обо всех властных элементах Российской Федерации. А только, конечно же, о некоторых.</p></td>
</tr>
</table>

<!--#include file = "footer.txt" -->
</body>
</html>
Примечание: исключительно в качестве примера, здесь рассматривается табличная верстка, при помощи тега table. Конечно, так уже давно практически никто не верстает; современная верстка делается при помощи тегов div на основе гибкого манипулирования их свойствами - расположением, обтеканием, размерами и т.д.

Директива #include

Теперь подробно проанализируем наши действия.

Директива #include вставляет указанный файл. У неё есть два атрибута.

  • file — вставляет файл из той же директории, что и основной документ. В значении указывается имя вставляемого файла без пути.
  • virtual — вставляет файл из другой директории этого сервера. В значении указывается путь, начиная от корневого каталога сайта.

В указании пути есть своя специфика, к которой необходимо быть крайне внимательными:

НЕ ИСПОЛЬЗУЮТСЯ сокращения «../».

НЕ ИСПОЛЬЗУЮТСЯ протокол (http://) и доменное имя (mysite.ru).

Путь НАЧИНАЕТСЯ СО СЛЭША (/)

Этот начальный слэш является «псевдонимом» корневого адреса (в данном случае — http://mysite.ru/).

Примечание: вставка SSI с другого сервера НЕВОЗМОЖНА.

ШАГ 2


  • Корректная вставка меню с использованием условного оператора
  • Использование переменных окружения для определения условия

КОРРЕКТНАЯ ВСТАВКА МЕНЮ С ИСПОЛЬЗОВАНИЕМ УСЛОВНОГО ОПЕРАТОРА

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

Для вставки разных вариантов кода существует условный оператор, точнее — даже три оператора, связанных между собой. Вот их полный синтаксис:

<!--#if expr = "условие_1" --> код HTML <!--#elif expr = "условие_2" --> код HTML <!--#else --> код HTML <!--#endif -->

Второй оператор, задающий дополнительное условие, и третий — для варианта без условия — не обязательны. Закрывающий оператор <!--#endif --> обязателен. Если нужно показать вставку только при каком-то условии, например, только если браузер — IE, то достаточно следующего:

<!--#if expr="$HTTP_USER_AGENT = /MSIE/ || $HTTP_USER_AGENT=/Microsoft/" -->
код HTML
<!--#endif -->

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

<!--#if expr = "условие_1" --> код HTML <!--#elif expr = "условие_2" --> код HTML <!--#elif expr = "условие_3" --> код HTML <!--#elif expr = "условие_4" --> код HTML <!--#endif -->

Теперь приступим к созданию меню. Ещё раз приведу его код:

<table width="600" border="1" cellspacing="0" cellpadding="0" align="center" bgcolor="#800000"><tr>
<td>
<div class="txtmenu"><a href="index.html" class="lnkmenu">Главная</a></div></td>
<td>
<div class="txtmenu"><a href="aboutsite.html" class="lnkmenu">О сайте</a></div></td>
<td>
<div class="txtmenu"><a href="aboutme.html" class="lnkmenu">Обо мне</a></div></td>
<td>
<div class="txtmenu"><a href="links.html" class="lnkmenu">Ссылки</a></div></td>
<td>
<div class="txtmenu"><a href="javascript: alert('Пока недоступно');" class="lnkmenu">Гостевая книга</a></div></td>
</tr></table>

Чтобы создать «пустой» пункт меню, нам нужно записать код без ссылки.

<td><div class="txtmenu">Главная</div></td>

Что касается изменения цвета шрифта, это уже определено в стилях CSS:

.txtmenu {text-align: center; color: #FF8080; font-weight: bold; font-family: Arial;}
a.lnkmenu:link, a.lnkmenu:visited, a.lnkmenu:active {color: #FFC; text-decoration: none;}
a.lnkmenu:hover {color: #FF8080; text-decoration: none;}

ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННЫХ ОКРУЖЕНИЯ ДЛЯ ОПРЕДЕЛЕНИЯ УСЛОВИЯ

Теперь надо найти какое-то условие, которое бы идентифицировало каждую конкретную страницу. Это может быть, например, имя файла данной страницы. Но как его вытащить в директиву?

Для этого существуют так называемые переменные окружения. Полный их список можно найти в прилагающемся справочнике. Нам же потребуется одна из них — DOCUMENT_URI, которая содержит имя текущего документа.

Примечание: Текущий документ — это та страница, которая выводится в браузер, поэтому DOCUMENT_URI любого вставного файла будет содержать имя файла главного документа.

Нужно учитывать, что DOCUMENT_URI содержит путь имени файла от корня и начинается со слэша. То есть, для файла http://mysite.ru/index.html это будет /index.html, а для http://mysite.ru/info/index.html — /info/index.html

Часто бывает удобнее пользоваться именем файла без пути. В данном случае — тоже. Поэтому сделаем вот так:

<!--#if expr = "$DOCUMENT_URI = /\/index.html/" -->

Итак:

Во-первых, нужно разъяснить интерпретатору, что DOCUMENT_URI — это переменная, а не просто некий набор символов. Для этого предваряем её спецсимволом $, который говорит о том, что все символы до пробела или другого спецсимвола составляют имя переменной.

Теперь разберёмся в «зубочистках», натыканных вокруг имени файла. Это регулярные выражения — система специальных символов и их комбинаций, с помощью которых задаётся шаблон для поиска нужных комбинаций в строках.

Нам нужно найти комбинацию «/index.htm». Поскольку в эту комбинацию входит слэш, который также используется в регулярных выражениях, нам нужно обозначить, что это не спецсимвол. Для этого предваряем его обратным слэшем: «\/index.htm». Теперь нужно задать поиск строки, в состав которой входила бы искомая комбинация. Для этого окружаем эту комбинацию слэшами: «/\/index.html/».

Условие сформировано: DOCUMENT_URI — это строка «/index.htm». Теперь загоняем его в оператор. В противном случае (если условие не подходит) выводим пункт со ссылкой:

<!--#if expr = "$DOCUMENT_URI = /\/index.html/" -->
<td><div class="txtmenu">Главная</div></td>
<!--#else -->
<td><div class="txtmenu"><a href="index.html" class="lnkmenu">Главная</a></div></td>
<!--#endif -->

То же самое делаем для каждого пункта, кроме последнего: гостевой книги ещё не существует, а когда появится — там будет свой интерфейс.

<table width="600" border="1" cellspacing="0" cellpadding="0" align="center" bgcolor="#800000"><tr>
<!--#if expr = "$DOCUMENT_URI = /\/index.html/" -->
<td><div class="txtmenu">Главная</div></td>
<!--#else -->
<td><div class="txtmenu"><a href="index.html" class="lnkmenu">Главная</a></div></td>
<!--#endif -->
<!--#if expr = "$DOCUMENT_URI = /\/aboutsite.html/" -->

<td><div class="txtmenu">О сайте</div></td>
<!--#else -->
<td><div class="txtmenu"><a href="aboutsite.html" class="lnkmenu">О сайте</a></div></td>
<!--#endif -->
<!--#if expr = "$DOCUMENT_URI = /\/aboutme.html/" -->

<td><div class="txtmenu">Обо мне</div></td>
<!--#else -->
<td><div class="txtmenu"><a href="aboutme.html" class="lnkmenu">Обо мне</a></div></td>
<!--#endif -->
<!--#if expr = "$DOCUMENT_URI = /\/links.html/" -->

<td><div class="txtmenu">Ссылки</div></td>
<!--#else -->
<td><div class="txtmenu"><a href="links.html" class="lnkmenu">Ссылки</a></div></td>
<!--#endif -->
<td><div class="txtmenu"><a href="javascript: alert('Пока недоступно');" class="lnkmenu">Гостевая книга</a></div></td>
</tr></table>

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

Всё дело в расширении .txt. Дело в том, что условные операторы, написанные в текстовых файлах, работают только в случаях, если обработка файлов с расширениями txt подключена для SSI в файле настроек .htaccess. Для этого нужно добавить в этот йфайл такую строчку:

AddType text/html .txt, .ssi, .html

Итак, мы рассмотрели, что можно задавать разные условия для вкладок. Конечно, данный пример выглядел бы проще и изящнее с массивом и циклом for, но чего нет, того нет, а на нет и суда нет. Разумеется, указанная возможность приведена лишь для демонстрации технологиии SSI. В реальной практике гораздо более удобно реализовать разные условия для вкладок, например, средствами javascript. В следующем шаге рассмотрим способ, позволяющий менять содержимое вкладок по запросу.

ШАГ 3


  • Ещё о переменных окружения
  • Назначение и изменение переменных (директивы #set и #echo)
  • Особенности переменных SSI

ЕЩЁ О ПЕРЕМЕННЫХ ОКРУЖЕНИЯ

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

Когда мы открываем ту или иную web-страницу, происходит своеобразная «стыковка» браузера и сервера. Для успешного соединения они должны передать друг другу определённую информацию. Для неё-то и существуют переменные окружения. Часть из них содержит информацию сервера, часть служит контейнерами для принятия информации от браузера.

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

Полный список переменных окружения данного сервера выводится директивой #printenv.

Выведем этот вписок.

ПРИМЕЧАНИЕ

Чтобы было «читабельнее», лучше это сделать в тэге <pre>, а чтобы при этом не порушить дизайн, назначить ему в CSS приемлемую ширину и задать прокрутку. Поскольку список очень длинный, имеет смысл ограничить и высоту контейнера (с соответствующей прокруткой).

<pre style="max-width: 610px; height: 300px; overflow: scroll;">
<!--#printenv -->
</pre>

Список переменных окружения

DOCUMENT_ROOT=/www/mysite/www/htdocs/
HTTP_CONNECTION=close
HTTP_FROM=crawler@alexa.com
HTTP_HOST=mysite.ru
HTTP_SERVER_ADDR=89.111.177.202
HTTP_USER_AGENT=ia_archiver
HTTP_X_REAL_IP=54.173.35.129
PATH=/sbin:/bin:/usr/sbin:/usr/bin
REMOTE_ADDR=54.173.35.129
REMOTE_PORT=18123
SCRIPT_FILENAME=/www/mysite/www/htdocs/info/ssi3.html
SCRIPT_URI=http://mysite.ru/info/ssi3.html
SCRIPT_URL=/info/ssi3.html
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=support@mysite.ru
SERVER_NAME=mysite.ru
SERVER_PORT=80
SERVER_SIGNATURE=<ADDRESS>Apache/1.3.42 Server at mysite.ru Port 80</ADDRESS>

SERVER_SOFTWARE=Apache/1.3.42 (Unix)
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/info/ssi3.html
SCRIPT_NAME=/info/ssi3.html
DATE_LOCAL=Monday, 26-Jun-2017 06:01:40 UTC
DATE_GMT=Monday, 26-Jun-2017 06:01:40 GMT
LAST_MODIFIED=Sunday, 09-Sep-2012 00:34:03 UTC
DOCUMENT_URI=/info/ssi3.html
DOCUMENT_PATH_INFO=
USER_NAME=mysite
DOCUMENT_NAME=ssi3.html


Примечание: Каждый сервер имеет свой набор переменных окружения. В главном эти наборы совпадают, но в деталях существуют различия. Поэтому, чтобы использовать те или иные переменные окружения, нужно выяснить, что имеется в наличии.

Наиболее «продвинутые» пользователи смогут сами настроить кое-что из этого, например, в файле .htaccess.

Кроме вывода этого огромного списка, директива #printenv ничего делать не умеет.

НАЗНАЧЕНИЕ И ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ
(ДИРЕКТИВЫ #set И #echo)

С помощью директивы #set мы можем назначить свои собственные переменные, а также изменить уже существующие.

Синтаксис

<!--#set var = "ИМЯ_ПЕРЕМЕННОЙ" value = "значение" -->
Примечание: Поскольку значением атрибута var всегда является имя переменной, префикс $ здесь не нужен.

Начнём с изменения уже существующих.

В списке, выведенном директивой #printenv, есть переменная SERVER_ADMIN — почтовый адрес администратора сервера. Предположим, требуется оставить на страничках свой почтовый адрес для контакта. Можно прописывать его вручную, а можно затолкать в переменную SERVER_ADMIN.

<!--#set var = "SERVER_ADMIN" value = "mysite2@yandex.ru" -->

Теперь я могу вывести его директивой #echo. Она выводит на экран значения переменных и имеет атрибуты encoding и var (об атрибуте encoding — чуть ниже).

Синтаксис

<!--#echo var = "ИМЯ_ПЕРЕМЕННОЙ" -->

Поскольку она содержит текст, выводимый на экран, её можно вставлять в любые тэги форматирования HTML.

<p><!--#echo var = "SERVER_ADMIN" --></p>

Результат

mysite2@yandex.ru

Теперь снова выведем список переменных и увидим, что значение SERVER_ADMIN изменилось.

DOCUMENT_ROOT=/www/info/www/htdocs/
HTTP_CONNECTION=close
HTTP_FROM=crawler@alexa.com
HTTP_HOST=mysite.ru
HTTP_SERVER_ADDR=89.111.177.202
HTTP_USER_AGENT=ia_archiver
HTTP_X_REAL_IP=54.173.35.129
PATH=/sbin:/bin:/usr/sbin:/usr/bin
REMOTE_ADDR=54.173.35.129
REMOTE_PORT=18123
SCRIPT_FILENAME=/www/info/www/htdocs/katalog/ssi3.html
SCRIPT_URI=http://mysite.ru/katalog/ssi3.html
SCRIPT_URL=/katalog/ssi3.html
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=mysite2@yandex.ru
SERVER_NAME=mysite.ru
SERVER_PORT=80
SERVER_SIGNATURE=<ADDRESS>Apache/1.3.42 Server at mysite.ru Port 80</ADDRESS>

SERVER_SOFTWARE=Apache/1.3.42 (Unix)
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/katalog/ssi3.html
SCRIPT_NAME=/katalog/ssi3.html
DATE_LOCAL=Monday, 26-Jun-2017 06:01:40 UTC
DATE_GMT=Monday, 26-Jun-2017 06:01:40 GMT
LAST_MODIFIED=Sunday, 09-Sep-2012 00:34:03 UTC
DOCUMENT_URI=/katalog/ssi3.html
DOCUMENT_PATH_INFO=
USER_NAME=info
DOCUMENT_NAME=ssi3.html

Точно так же можно назначать и свои собственные переменные.

<!--#set var = "test1" value = "Тестируем директиву #set" --> <p><!--#echo var = "test1" --></p>

Результат

Тестируем директиву #set

ОСОБЕННОСТИ ПЕРЕМЕННЫХ SSI

«Время жизни» значений переменных

Обратите внимание: при изменении значения переменной окружения в списке несколькими абзацами выше ничего не изменилось. Переменная «живёт», как в старом анекдоте, «от меня до другого столба», то есть, до следующей инструкции назначения.

Таким образом, все наши манипуляции с переменными окружения никак не влияют на глобальные настройки, а создают лишь «псевдонимы» для них на данном отрезке пространства HTML.

Точно так же ведут себя и наши собственные переменные.

Мы только что создали переменную test1, а теперь переназначим и посмотрим.

<!--#set var = "test1" value = "Все хорошо" --> <p><!--#echo var = "test1" --></p>

Результат:

Все хорошо

Интерпретация значений переменных в браузере

Строки значений переменных выводятся на экран именно в том виде, в котором были назначены. Если в строке переменной были использованы тэги HTML, то они не будут интерпретированы браузером. В коде HTML они будут заменены на спецсимволы, а на экране отобразятся в первозданном виде.

<!--#set var = "test1" value = "<h1>Заголовок</h1>" --> <!--#echo var = "test1" -->

Результат

<h1>Заголовок</h1>

(Поскольку мы не заключали вывод текста ни в какие тэги, он выводится без форматирования.)

А если мы посмотрим в браузере исходный код страницы, то увидим в этом месте следующее:

&lt;h1&gt;Заголовок&lt;/h1&gt;

Не спасёт нас и запись значения спецсимволами. Они останутся без изменений и превратятся на экране в то же отображение тэгов.

<!--#set var = "test2" value = "&lt;h1&gt;Заголовок&lt;/h1&gt;" --> <!--#echo var = "test2" -->

Результат

<h1>Заголовок</h1>

Настройка интерпретации вывода переменных

В XSSI — расширенной версии SSI — у директивы #echo имеется атрибут encoding, который сообщает браузеру, как интерпретировать текст и символы языка HTML.

Значения:

  • entity — по умолчанию. В этом случае происходит то, что мы уже видели: замена символов языка HTML на спецсимволы для вывода их на страницу;
  • url — произодится так называемое escape-преобразование, т.е. все символы приобретут вид %nn (nn — код символа в 16-ричной кодировке), что позволит их применять в строке URL;
  • none — не будет никаких преобразований, т.е. тэги HTML, которые раньше заменялись на спецсимволы, теперь заменяться не будут, и в переменные SSI можно вставлять код HTML. А вот спецсимволы будут заменяться на тэги.
Примечание: Атрибут encoding всегда ставится перед атрибутом var.

Теперь настроим кодировку вывода нашей первой переменной:

<!--#echo encoding = "none" var = "test1" -->

Результат

Заголовок

Заданные спецсимволы также превращаются в работающие HTML-тзги (выводим вторую переменную):

<!--#echo encoding = "none" var = "test2" -->

Результат

Заголовок

Ну и попробуем из любопытства encoding = "url":

<!--#echo encoding = "url" var = "test1" --><br> <!--#echo encoding = "url" var = "test2" -->

Результат

%3ch1%3e%c7%e0%e3%ee%eb%ee%e2%ee%ea%3c/h1%3e
%3ch1%3e%c7%e0%e3%ee%eb%ee%e2%ee%ea%3c/h1%3e

Странно, но оба результата получились одинаковыми.

ШАГ 4


  • Директива #config
  • Собственный текст сообщения об ошибке
  • Определение и вывод размера файлов
  • Форматирование вывода даты и времени
  • Маленький практикум

ДИРЕКТИВА #config

Эта директива управляет следующимими опциями SSI:

  • установка текста сообщения об ошибке (атрибут errmsg);
  • настройка формата вывода размера файла (атрибут sizefmt);
  • настройка формата вывода даты/времени (атрибут timefmt).

Сама директива ничего не выводит, для вывода её значений нужно использовать другие инструкции (не только #echo).

СОБСТВЕННЫЙ ТЕКСТ СООБЩЕНИЯ ОБ ОШИБКЕ

Если инструкция SSI или скрипта CGI задана некорректно, то на месте вывода данных этой инструкции сервер помещает сообщение об ошибке. Стандартно оно выглядит так: [an error occurred while processing this directive].

С помощью #config errmsg вместо этого текста можно назначить любой другой. Например, из «Жалобной книги» Чехова:

<!--#config errmsg = "[Как удивителен этот мир]" -->

Чтобы это сообщение вывелось на страницу, не нужно никаких специальных директив: достаточно написать что-нибудь неправильное. Давайте попробуем так:

<!--#tratata -->

Результат

[Как удивителен этот мир]

Примечание: инструкция #config errmsg должна быть помещена на основной странице документа. Находясь во вложенной странице, она не срабатывает. Так что задать её один раз на весь сайт с помощью SSI не получится.

ОПРЕДЕЛЕНИЕ И ВЫВОД РАЗМЕРА ФАЙЛОВ

Инструкция #config sizefmt определяет формат вывода размера файла и имеет 2 значения:

  • bytes — размер файла в байтах;
  • abbrev — размер файла в килобайтах (а если больше мегабайта, то в мегабайтах).

Синтаксис

<!--#config sizefmt = "bytes" --> <!--#config sizefmt = "abbrev" -->

Вывод на экран осуществляется директивой #fsize.

Синтаксис

<!--#fsize file = "имя_файла" --> <!--#fsize virtual = "/путь/имя_файла" -->

Атрибуты file и virtual работают точно так же, как в директиве #include.

Посмотрим в байтах размер файла, например, с музыкой в папке MP3 от корня.

<!--#config sizefmt = "bytes" --> <p><!--#fsize virtual = "/MP3/sound.mp3" --></p>

Результат

9,148,093

Обратите внимание: запятыми разделяются тысячные разряды, а десятичная часть будет отделяться точкой, как мы сейчас увидим, выводя округлённый размер (файл большой, здесь он будет в мегабайтах выведен):

<!--#config sizefmt = "abbrev" --> <p><!--#fsize virtual = "/MP3/sound.mp3" --></p>

Результат

8.7M

(Можете проверить: 9 148 093 / 1024 и ещё на 1024 даёт 8,724301329 и т.д.)

ФОРМАТИРОВАНИЕ ВЫВОДА ДАТЫ И ВРЕМЕНИ

Для настройки формата даты/времени используется инструкция #config timefmt.

Синтаксис

<!--#config timefmt = "шаблон" -->

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

Формат

Описание

Результат

Примечания

%a

Краткое название дня недели

Thu

 

%A

Полное название дня недели

Thursday

 

%b

Аббревиатура названия месяца

Jun

В трёхбуквенном мае полное и краткое названия совпадают.

%B

Полное название месяца

June

%d

День месяца

08

от 01 до 31
(с предваряющим нулём)

%D

Дата в формате "%m/%d/%y"

06/08/17

 

%e

День месяца

8

от 1 до 31
(без предваряющего нуля)

%H

Часы в 24-часовом формате

04

 

%I

Часы в 12-часовом формате

04

 

%m

Номер месяца

06

 

%M

Минуты

01

 

%p

AM/PM (до полудня/после)

AM

 

%r

Время в формате "%I:%M:%S %p"

04:01:40 AM

 

%R

Время в формате "%H:%M"

04:01

 

%S

Секунды

40

 

%t

Вставка символа табуляции

 

%T

Время в формате "%H:%M:%S"

04:01:40

 

%U

Неделя года (первый день недели — воскресенье)

23

 

%w

Номер дня недели

4

С воскресенья по субботу, 0–6

%W

Неделя года (первый день недели — понедельник)

23

 

%x

формат даты по умолчанию

06/08/17

 

%X

формат времени по умолчанию

04:01:40

 

%y

Год в формате ГГ

17

 

%Y

Год в формате ГГГГ

2017

 

gethostbyaddr не возвращает имя хоста рнр

Можно комбинировать шаблоны друг с другом и с любыми прочими символами.

Например, для шаблона ДД.ММ.ГГ, ЧЧ:ММ нужна следующая комбинация (в неё включены шаблоны из таблицы, знаки препинания и пробел):

<!--#config timefmt = "%d.%m.%Y, %H:%M" -->

Значение текущего времени находится в переменнх окружения DATE_LOCAL (в локальных настройках) и DATE_GMT (по Гринвичу). Её можно вывести директивой #echo, предварительно отформатировав через #config timefmt.

<!--#config timefmt = "%d.%m.%Y, %H:%M" --> <!--#echo var = "DATE_LOCAL" -->

Результат

29.03.2024, 18:05

Есло мы изменим в шаблоне %d на %e, то получится почти то же самое, но однозначное календарное число будет без предваряющего нуля. Если Вы зашли сюда до 10-го числа, то увидите. Выведем для разнообразия по Гринвичу:

<!--#config timefmt = "%e.%m.%Y, %H:%M" --> <!--#echo var = "DATE_GMT" -->

Результат

29.03.2024, 15:05

Примечание: на серверах могут быть свои настройки времени - московское, нью-йоркское, гринвичское или еще какое. В итоге, через указанную директиву SSI будет показываться именно то время, которое установлено на сервере. Чтобы привести его к желаемому формату (например, чтобы сайт показывал местное время для каждого пользователя), можно сделать коррекцию, например, средствами javascript (при этом браузер пользователя будет брать локальное время, установленное на его компьютере). Это может быть неудобным, если у пользователя на компьютере установлено неверное время.

И наконец, есть ещё одна переменная окружения, связанная со временем: LAST_MODIFIED, дата последнего обновления страницы (не только данной, но и любой на этом же сервере). Она содержит локальное время обновления и выводится с помощью другой директивы: #flastmod. Здесь тоже учитываются настройки #config timefmt.

Синтаксис

<!--#flastmod file = "имя_файла" --> <!--#flastmod virtual = "/путь/имя_файла" -->

Атрибуты file и virtual работают аналогично уже рассмотренным случаям.

Настроим #config timefmt чуть по-другому (чтобы потренироваться) и выведем последние обновления данной и главной страниц:

<!--#config timefmt = "%e/%m-%y г. %H час. %M мин." -->
<p>Последнее обновление этой страницы: <!--#flastmod file = "ssi4.html" --></p>
<p>
Последнее обновление главной страницы: <!--#flastmod virtual = "/index.html" --></p>

Результат

Последнее обновление этой страницы: 26/09-14 г. 10 час. 55 мин.;

Последнее обновление главной страницы: [an error occurred while processing this directive] 5/12-15 г. 18 час. 14 мин.

ПРИМЕЧАНИЕ

Примечание:

Для вывода времени обновления текущей страницы можно также напрямую воспользоваться переменной LAST_MODIFIED:

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

МАЛЕНЬКИЙ ПРАКТИКУМ

А можно ли создавать для даты такие форматы, которые не предусмотрены шаблонами? Например, такой:

МАЛЕНЬКИЙ ПРАКТИКУМ

А можно ли создавать для даты такие форматы, которые не предусмотрены шаблонами? Например, такой:

Сегодня четверг, 8 июня 2017 года.

Можно. Ибо то, что вы видите, сделано с помощью директив SSI.

Как?

А вот давайте попрактикуемся.

Тут важно понять два механизма.

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

Во-вторых, пользуясь условным оператором, мы можем назначать разные значения на переменную B в зависимости от текущего значения переменной A.

Сейчас поймём это на практике.

Итак, настраиваем дни недели. Шаблон %w хранит номера дней недели с 0 до 6 (от воскресенья до субботы). Настраиваем переменную numday на «перехват» текущего дня недели:

<!--#config timefmt = "%w" -->
<!--#set var = "numday" value = "$DATE_LOCAL" -->

ОБРАТИТЕ ВНИМАНИЕ

Чтобы показать, что value — не строка, а содержимое переменной, необходим префикс $.

Теперь, как бы мы ни перестраивали #config timefmt, шаблон %w надёжно хранится в переменной numday. А переменная day с помощью условного оператора будет именовать нужный день по-русски:

<!--#if expr = "$numday=1" -->
<!--#set var = "day" value = "понедельник" -->
<!--#elif expr = "$numday=2" -->
<!--#set var = "day" value = "вторник" -->
<!--#elif expr = "$numday=3" -->
<!--#set var = "day" value = "среда" -->
<!--#elif expr = "$numday=4" -->
<!--#set var = "day" value = "четверг" -->
<!--#elif expr = "$numday=5" -->
<!--#set var = "day" value = "пятница" -->
<!--#elif expr = "$numday=6" -->
<!--#set var = "day" value = "суббота" -->
<!--#else -->
<!--#set var = "day" value = "воскресенье" -->
<!--#endif -->

Теперь то же самое проделываем с месяцами (соответственно в переменные nummonth и month):

<!--#config timefmt = "%m" -->
<!--#set var = "nummonth" value = "$DATE_LOCAL" -->

<!--#if expr = "$nummonth=01" -->
<!--#set var = "month" value = "января" -->
<!--#elif expr = "$nummonth=02" -->
<!--#set var = "month" value = "февраля" -->
<!--#elif expr = "$nummonth=03" -->
<!--#set var = "month" value = "марта" -->
<!--#elif expr = "$nummonth=04" -->
<!--#set var = "month" value = "апреля" -->
<!--#elif expr = "$nummonth=05" -->
<!--#set var = "month" value = "мая" -->
<!--#elif expr = "$nummonth=06" -->
<!--#set var = "month" value = "июня" -->
<!--#elif expr = "$nummonth=07" -->
<!--#set var = "month" value = "июля" -->
<!--#elif expr = "$nummonth=08" -->
<!--#set var = "month" value = "августа" -->
<!--#elif expr = "$nummonth=09" -->
<!--#set var = "month" value = "сентября" -->
<!--#elif expr = "$nummonth=10" -->
<!--#set var = "month" value = "октября" -->
<!--#elif expr = "$nummonth=11" -->
<!--#set var = "month" value = "ноября" -->
<!--#else -->
<!--#set var = "month" value = "декабря" -->
<!--#endif -->

Настраиваем число (без предваряющего нуля в числах до 10-го) и загоняем в переменную date:

<!--#config timefmt = "%e" -->
<!--#set var = "date" value = "$DATE_LOCAL" -->

Задаём четырёхзначный формат года (в переменную year):

<!--#config timefmt = "%Y" -->
<!--#set var = "year" value = "$DATE_LOCAL" -->

Выводим строку:

<p><b>Сегодня <!--#echo var = "day" -->, <!--#echo var = "date" --> <!--#echo var = "month" --> <!--#echo var = "year" --> года.</b></p>

Результат мы уже видели.

Сегодня четверг, 8 января 2022 года.

Конечно, это всё очень громоздко: ни циклов, ни массивов, ни т.п. Разумеется, гораздо проще сделать то же самое или средствами PHP (или иного языка программирования), или, если из всей возможной динамики на хостинге доступна лишь SSI, средствами javascript (на стороне клиента). Т.е. этот пример - лишь учебный, приведен, разве что, для демонстрации возможностей SSI.

Вся технология SSI: Часть 1, Часть 3, Часть 4, Часть 5


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-2024 Научный консалтинг