Открыть сервис

Протокол SSI

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

История

Технология SSI была разработана в середине 1990-х годов как часть спецификации HTTP-сервера NCSA HTTPd. В 1995 году с появлением сервера Apache HTTP Server (который заменил NCSA HTTPd) поддержка SSI была включена в его модуль mod_include. В то время веб-страницы в основном состояли из статического HTML, и SSI стал одним из первых способов внедрения динамического контента без необходимости написания CGI-скриптов.

В 1996 году спецификация SSI была стандартизирована в рамках проекта Apache, хотя отдельные реализации (например, в IIS от Microsoft) имели незначительные отличия в синтаксисе. С развитием серверных языков (PHP, JSP, ASP) в конце 1990-х — начале 2000-х годов популярность SSI снизилась, так как более мощные технологии позволяли выполнять сложные операции с базами данных и бизнес-логику. Однако SSI остаётся востребованным в простых статических сайтах, системах управления контентом (CMS) и приложениях, где требуется минимальная динамика без дополнительных PHP-интерпретаторов.

Принцип работы

SSI работает на уровне веб-сервера. Когда сервер получает запрос на HTML-файл с расширением .shtml (или .shtm), он сначала обрабатывает его модулем SSI, а затем отправляет готовый HTML-документ клиенту. Директивы SSI записываются в виде HTML-комментариев, что делает их невидимыми для браузера, если сервер не поддерживает SSI.

Синтаксис

Основной формат директивы SSI: `` <!--#command param1="value1" param2="value2" --> ` Где command — одна из команд (например, include, echo, exec`), а параметры задают источник данных или условия.

Примеры директив

  • #include — встраивает содержимое другого файла:

`` <!--#include virtual="/header.html" --> ` Параметр virtual указывает путь относительно корня сайта, file` — относительно текущего каталога.

  • #echo — выводит значение переменной окружения:

`` <!--#echo var="DATE_LOCAL" --> ` Переменные: DATE_LOCAL (текущая дата/время на сервере), DOCUMENT_NAME (имя текущего файла), LAST_MODIFIED` (дата последнего изменения) и другие.

  • #exec — выполняет внешнюю программу или CGI-скрипт:

`` <!--#exec cmd="ls -la" --> `` (Обычно отключается в целях безопасности).

  • #set — устанавливает значение переменной:

`` <!--#set var="user" value="admin" --> ``

  • #if / #elif / #else / #endif — условное включение фрагментов:

`` <!--#if expr="$REMOTE_ADDR = 127.0.0.1" --> <p>Доступ разрешён</p> <!--#else --> <p>Доступ запрещён</p> <!--#endif --> ``

Реализации и поддержка

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

Apache HTTP Server

В Apache SSI реализован через модуль mod_include. Для включения SSI для файлов с расширением .shtml в конфигурации добавляется: `` AddType text/html .shtml AddHandler server-parsed .shtml `` Также можно включить SSI для всех HTML-файлов, но это снижает производительность.

Nginx

Nginx изначально не поддерживает SSI в полном объёме, но имеет модуль ngx_http_ssi_module, который реализует базовые директивы (include, echo, set). Команда #exec и условные операторы (#if) не поддерживаются. Для включения SSI в Nginx используется директива: `` ssi on; ` в блоке location или server`.

Microsoft IIS

В IIS поддержка SSI называется «Server-Side Include» и включается через настройки приложения. Синтаксис аналогичен Apache, но некоторые переменные окружения отличаются (например, DATE_LOCAL заменяется на DATE_GMT). В современных версиях IIS (7.0+) SSI часто отключён по умолчанию и требует установки отдельного модуля.

Другие серверы

  • Lighttpd — поддерживает SSI через модуль mod_ssi.
  • Cherokee — имеет встроенную поддержку SSI.
  • OpenBSD httpd — не поддерживает SSI.

Применение

SSI используется в следующих сценариях:

  • Модульное построение сайтов: встраивание общих элементов (шапка, подвал, навигация) во все страницы. Это упрощает поддержку — изменение одного файла автоматически обновляет все страницы.
  • Отображение динамической информации: вывод текущей даты, времени, счётчика посещений, версии документа.
  • Условное отображение контента: показ разного содержимого в зависимости от IP-адреса, времени суток или браузера пользователя.
  • Интеграция с внешними скриптами: выполнение CGI-скриптов или команд оболочки (при включённой опции #exec).
  • Сборка страниц в CMS: некоторые статические генераторы сайтов (например, Jekyll) используют SSI-подобные директивы для сборки HTML-файлов на этапе генерации.

Преимущества и недостатки

Преимущества

  • Простота: не требует изучения языков программирования, синтаксис основан на HTML-комментариях.
  • Низкое потребление ресурсов: обработка SSI выполняется быстрее, чем запуск PHP-интерпретатора или CGI-скрипта.
  • Совместимость: работает на любом сервере с поддержкой SSI, не требует установки дополнительных модулей.
  • Безопасность: при правильной настройке (отключение #exec) SSI не создаёт уязвимостей, характерных для скриптовых языков.

Недостатки

  • Ограниченная функциональность: SSI не поддерживает работу с базами данных, сложные вычисления, сессии или обработку форм.
  • Зависимость от сервера: для работы SSI требуется сервер с поддержкой модуля; статические хостинги (например, GitHub Pages) не поддерживают SSI.
  • Производительность: при включении SSI для всех HTML-файлов сервер тратит время на парсинг каждого запроса, что может снизить скорость обработки на высоконагруженных сайтах.
  • Сложность отладки: ошибки в директивах SSI не всегда видны — сервер может просто проигнорировать некорректную директиву или выдать пустую строку.

Безопасность

При использовании SSI необходимо учитывать риски:

  • Команда #exec: если включена, позволяет выполнять произвольные команды на сервере. Злоумышленник может внедрить вредоносную команду через параметры URL (например, <!--#exec cmd="rm -rf /" -->). Рекомендуется отключать #exec в конфигурации сервера.
  • Инъекции через переменные: если в директиве #echo используется переменная, полученная от пользователя (например, REMOTE_ADDR), это может привести к XSS-атакам, если вывод не экранируется.
  • Утечка информации: переменные окружения (DOCUMENT_ROOT, SERVER_SOFTWARE) могут раскрыть конфиденциальные данные о сервере.

Сравнение с альтернативами

ТехнологияСложностьПроизводительностьФункциональностьПоддержка серверов
SSIНизкаяВысокаяОграниченнаяApache, Nginx, IIS
PHPСредняяСредняяВысокаяПочти все серверы
JSPВысокаяСредняяВысокаяJava-серверы
ASP.NETВысокаяСредняяВысокаяIIS
Статический HTMLНизкаяМаксимальнаяНулеваяЛюбой сервер

Интересные факты

  • Расширение .shtml (Server-parsed HTML) было введено для того, чтобы сервер мог отличать файлы, требующие обработки SSI, от обычных HTML-файлов.
  • В Apache 2.0 модуль mod_include был переписан с нуля, что улучшило производительность и добавил поддержку вложенных директив.
  • SSI до сих пор используется в некоторых крупных проектах, например, в документации Apache и в системах мониторинга (Nagios, Cacti).
  • В 2010-х годах с ростом популярности статических генераторов сайтов (Jekyll, Hugo) интерес к SSI возродился, так как эти генераторы используют аналогичный принцип включения фрагментов на этапе сборки.

Источники

  1. RFC 3875 — The Common Gateway Interface (CGI) Version 1.1 (упоминание SSI как альтернативы).
  2. Apache HTTP Server Documentation — Module mod_include.
  3. Nginx Documentation — Module ngx_http_ssi_module.
  4. Microsoft IIS Documentation — Server-Side Includes.
  5. «Apache: The Definitive Guide» by Ben Laurie and Peter Laurie (O'Reilly Media, 2003).
  6. «HTTP: The Definitive Guide» by David Gourley and Brian Totty (O'Reilly Media, 2002).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →