Протокол 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 возродился, так как эти генераторы используют аналогичный принцип включения фрагментов на этапе сборки.
Источники
- RFC 3875 — The Common Gateway Interface (CGI) Version 1.1 (упоминание SSI как альтернативы).
- Apache HTTP Server Documentation — Module mod_include.
- Nginx Documentation — Module ngx_http_ssi_module.
- Microsoft IIS Documentation — Server-Side Includes.
- «Apache: The Definitive Guide» by Ben Laurie and Peter Laurie (O'Reilly Media, 2003).
- «HTTP: The Definitive Guide» by David Gourley and Brian Totty (O'Reilly Media, 2002).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →