Spec-Zone.ru › Apache HTTP Server

Apache httpd Руководство: Введение в Server Side Includes

Server-side includes предоставляют способ добавления динамического содержимого в существующие HTML-документы.

Введение

Связанные модули Связанные директивы
  • mod_include
  • mod_cgi
  • mod_expires
  • Options
  • XBitHack
  • AddType
  • SetOutputFilter
  • BrowserMatchNoCase

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

В последней части статьи мы обсудим некоторые более сложные возможности SSI, такие как условные операторы в ваших директивах SSI.

Что такое SSI?

SSI (Server Side Includes) — это директивы, которые размещаются в HTML-страницах и оцениваются на сервере во время предоставления страниц. Они позволяют добавлять динамически генерируемое содержимое в существующую HTML-страницу, не загружая всю страницу через CGI-программу или другую динамическую технологию.

Например, вы можете разместить директиву в существующей HTML-странице, например:

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

И при предоставлении страницы этот фрагмент будет обработан и заменён его значением:

Tuesday, 15-Jan-2013 19:28:54 EST

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

Настройка сервера для разрешения SSI

Для разрешения SSI на вашем сервере вам необходимо иметь следующую директиву в файле httpd.conf или в файле .htaccess.

Options +Includes

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

Не каждый файл обрабатывается на предмет директив SSI. Вы должны указать Apache, какие файлы нужно обрабатывать. Существует два способа сделать это. Вы можете указать Apache обрабатывать все файлы с определённым расширением файла, например .shtml, с помощью следующих директив:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

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

Другой метод заключается в использовании директивы XBitHack:

XBitHack on

XBitHack сообщает Apache обрабатывать файлы на наличие директив SSI, если для них установлен бит выполнения. Таким образом, чтобы добавить директивы SSI в существующую страницу, вместо изменения имени файла вам просто нужно сделать файл исполняемым с помощью chmod.

chmod +x pagename.html

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

Конечно, в Windows нет такого понятия, как бит выполнения, поэтому это несколько ограничивает ваши возможности.

По умолчанию Apache не отправляет HTTP-заголовки последней даты изменения и длины содержимого для страниц SSI, поскольку эти значения трудно вычислить для динамического содержимого. Это может помешать кэшированию вашего документа и привести к замедлению восприятия производительности клиента. Есть два способа решения этой проблемы:

  1. Используйте конфигурацию XBitHack Full . Это сообщает Apache определить последнюю дату изменения, рассматривая только дату первоначально запрошенного файла, игнорируя дату изменения включённых файлов.
  2. Используйте директивы, предоставляемые mod_expires, чтобы установить явное время истечения срока действия ваших файлов, тем самым позволяя браузерам и прокси знать, что их можно кэшировать.

Основные директивы SSI

Директивы SSI имеют следующий синтаксис:

<!--#function attribute=value attribute=value ... -->

Они отформатированы как HTML-комментарии, поэтому, если SSI не правильно включён, браузер проигнорирует их, но они всё ещё будут видны в исходном коде HTML. Если SSI правильно настроен, директива будет заменена её результатом.

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

Дата сегодняшнего дня

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

Функция echo просто выводит значение переменной. Существует множество стандартных переменных, которые включают весь набор переменных среды, доступных CGI-программам. Кроме того, вы можете определить свои переменные с помощью функции set.

Если вам не нравится формат, в котором печатается дата, вы можете использовать функцию config с атрибутом timefmt для изменения этого форматирования.

<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->

Дата изменения файла

This document last modified <!--#flastmod file="index.html" -->

Эта функция также подчиняется конфигурациям форматов timefmt.

Включение результатов CGI-программы

Это одно из наиболее распространённых применений SSI — вывод результатов CGI-программы, например, всем любимого счётчика посещений.

<!--#include virtual="/cgi-bin/counter.pl" -->

Дополнительные примеры

Ниже приведены конкретные примеры того, что вы можете сделать в своих HTML-документах с помощью SSI.

Когда был изменён этот документ?

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

<!--#config timefmt="%A %B %d, %Y" -->
This file last modified <!--#flastmod file="ssi.shtml" -->

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

<!--#config timefmt="%D" -->
This file last modified <!--#echo var="LAST_MODIFIED" -->

Для получения более подробной информации о формате timefmt перейдите на ваш любимый поисковый сайт и найдите strftime . Синтаксис тот же.

Включение стандартного футера

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

Использование файла включения для заголовка и/или футера может снизить нагрузку при таких обновлениях. Вам просто нужно создать один файл футера и затем включить его в каждую страницу с помощью команды SSI include . Функция include может определить, какой файл включить, с помощью атрибута file или атрибута virtual. Атрибут file — это путь к файлу, относительный к текущему каталогу. Это означает, что это не может быть абсолютный путь к файлу (начинающийся с /), и он не может содержать ../ в этом пути. Атрибут virtual , вероятно, более полезен и должен указывать URL, относительный к документу, который отображается. Он может начинаться с /, но должен находиться на том же сервере, что и файл, который отображается.

<!--#include virtual="/footer.html" -->

Я часто объединяю последние две вещи, помещая директиву LAST_MODIFIED внутри файла футера, который нужно включить. Директивы SSI могут быть содержатся во включённом файле, и включения могут быть вложены — то есть, включённый файл может включать другой файл и так далее.

Что ещё можно настроить?

В дополнение к возможности изменения формата времени вы также можете сделать ещё две вещи.

Обычно, когда что-то идёт не так с вашей директивой SSI, вы получаете сообщение

[an error occurred while processing this directive]

Если вы хотите изменить это сообщение на другое, вы можете сделать это с помощью атрибута errmsg функции config:

<!--#config errmsg="[It appears that you don't know how to use SSI]" -->

Надеюсь, конечные пользователи никогда не увидят это сообщение, потому что вы решите все проблемы с вашими директивами SSI до запуска вашего сайта. (Правильно?)

И вы можете изменить формат, в котором возвращаются размеры файлов, с помощью атрибута sizefmt . Вы можете указать bytes для полного количества байтов или abbrev для сокращённого числа в Кб или Мб, в зависимости от ситуации.

Выполнение команд

Вот что ещё вы можете сделать с помощью функции exec . Вы можете заставить SSI выполнить команду с помощью оболочки (/bin/sh, точнее — или оболочки DOS, если вы работаете в Win32). Например, следующее даст вам список файлов в каталоге.

<pre>
<!--#exec cmd="ls" -->
</pre>

Или, в Windows

<pre>
<!--#exec cmd="dir" -->
</pre>

Вы, возможно, заметите некоторое странное форматирование при использовании этой директивы в Windows, потому что вывод из dir содержит строку ``<dir>'', которая сбивает с толку браузеры.

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

Дополнительные приёмы SSI

Помимо вывода содержимого, Apache SSI предоставляет возможность установки переменных и использования этих переменных в сравнениях и условных операторах.

Установление переменных

Используя директиву set, вы можете задавать переменные для последующего использования. Нам это понадобится позднее в обсуждении, поэтому мы поговорим об этом здесь. Синтаксис выглядит следующим образом:

<!--#set var="name" value="Rich" -->

Помимо простого задания значений напрямую, вы можете использовать любые другие переменные, включая переменные окружения или переменные, обсуждавшиеся выше (например, LAST_MODIFIED), чтобы присваивать значения вашим переменным. Вы укажете, что что-то является переменной, а не строкой, используя знак доллара ($) перед именем переменной.

<!--#set var="modified" value="$LAST_MODIFIED" -->

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

<!--#set var="cost" value="\$100" -->

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

<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->

Условные выражения

Теперь, когда у нас есть переменные и мы можем задавать и сравнивать их значения, мы можем использовать их для выражения условных конструкций. Это позволяет SSI быть своеобразным мини-языком программирования. mod_include предоставляет if, elif, else, endif структуру для построения условных операторов. Это позволяет вам эффективно генерировать несколько логических страниц из одной фактической страницы.

Структура этой условной конструкции:

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

test_condition может быть любым видом логического сравнения — сравнение значений друг с другом или проверка «истинности» определённого значения. (Даная строка истинна, если она не пуста.) Полный список операторов сравнения, доступных вам, смотрите в документации mod_include.

Например, если вы хотите настроить текст на вашей веб-странице в зависимости от времени суток, вы можете использовать следующий код, размещённый в HTML-странице:

Good <!--#if expr="%{TIME_HOUR} <12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->

Любые другие переменные (как те, что вы определяете, так и обычные переменные окружения) могут использоваться в условных операторах. Для получения дополнительной информации об обработчике оценки выражений см. Выражения в Apache HTTP Server.

Благодаря возможности Apache устанавливать переменные окружения с помощью директивы SetEnvIf и других связанных директив, эта функциональность позволяет вам выполнять множество видов динамического содержимого на стороне сервера без обращения к полному веб-приложению.

Заключение

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

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/howto/ssi.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API