Apache. Документация на русском


Разделы:   1    2    3    4    5      6      7    8    9    10    11    12    13    14    15    16  

Раздел 6. Руководства, учебные пособия и инструкции

Пункты:   49    50    51      52      53    54    55    56  

 <         > 
  RU            EN  

Пункт 52. Включения на стороне сервера: введение

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

Введение

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

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

Что такое ССИ?

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

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

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

И, когда страница обслуживается, этот фрагмент будет оцениваться и заменяться его значением:

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

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

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

Чтобы разрешить SSI на вашем сервере, вы должны иметь следующую директиву либо в вашем apache2.conf файле, либо в .htaccess файле:

 Опции +Включает 

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

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

 AddType текст/html .shtml
AddOutputFilter ВКЛЮЧАЕТ .shtml 

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

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

 XBitHack на 

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 . Синтаксис такой же.

Включая стандартный нижний колонтитул

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

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

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

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

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

В дополнение к возможности config формата времени, вы можете также config две другие вещи.

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

[an error occurred while processing this directive]

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

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

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

И вы можете указать config формат, в котором размеры файлов возвращаются с 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 -->

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

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

Заключение

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



 <         > 

Пункты:   49    50    51      52      53    54    55    56  

Рейтинг@Mail.ru