Перейти к основному содержимому

SiteClosed.php

Этот класс отвечает за функционал «Заглушки» (Site Maintenance mode). Позволяет закрыть публичную часть сайта от обычных посетителей, но при этом оставить доступ для разработчиков, администраторов и доверенных лиц.

Основная логика: метод userHasAccess()

Это «входная дверь». Метод проверяет, включена ли опция закрытия сайта в настройках модуля.

  • Если выключена (site_closed_active !== 'Y') — доступ разрешен всем (true).
  • Если включена — запускается цепочка проверок. Если хотя бы одна из них вернет true, пользователь увидит сайт.

Цепочка проверок (условия исключения):

  1. Локальная разработка (isLocalDeployment) — разработчик на своей машине всегда видит сайт.
  2. Администратор (isAdmin) — авторизованные админы Битрикса видят сайт.
  3. Спец. разделы (inSpecialUri) — папка /bitrix/ или API-пути не должны блокироваться.
  4. Консоль (inCli) — скрипты на кроне (PHP CLI) должны работать беспрепятственно.
  5. Секретный код/Cookie (userDeviceHasAccess) — доступ по «секретной ссылке».
  6. Белый список IP (userIpHasAccess) — например, офис компании.

Подробный разбор механизмов доступа

А. Доступ по секретному коду

Метод userDeviceHasAccess позволяет дать доступ клиенту или тестировщику без IP и авторизации:

  1. Через URL: Если добавить к адресу параметр ?openingCode=ВАШ_КОД, класс проверит его.
  2. Установка Cookie: Если код совпал, сайт генерирует «пропуск» (хеш пароля) и сохраняет его в куки браузера на 1 год.
  3. Безопасность: В куках хранится не сам секретный код, а его хеш (password_hash).

Б. Белый список IP

В конструкторе данные из настроек модуля (строка через запятую) превращаются в массив:

$this->whiteListIp = explode(',', Facade\Helper::getModuleOption('site_closed_white_list_ip'));

Если IP пользователя ($_SERVER['REMOTE_ADDR']) есть в этом списке, блокировка снимается.

В. Исключения по URL (uriPrefixes)

Чтобы админка Битрикса продолжала работать, даже если сайт закрыт, используются префиксы. Обычно в настройках там прописано /bitrix,/api. Метод inSpecialUri проверяет, начинается ли текущий адрес с одного из этих префиксов:

if (str_starts_with($requestUri, $prefix)) { return true; }

Г. Окружение (Environment)

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

  • ENVIRONMENT === 'dl' (вероятно, "Development Local").
  • IS_DDEV_PROJECT (поддержка популярного инструмента DDEV).

Как происходит блокировка (showClosedPage)

Если ни одна проверка не прошла, вызывается этот метод:

  1. Он ищет файл шаблона заглушки в папке модуля (include/site_closed.php).
  2. Если файл найден — подключает его (там может быть красивая верстка «Сайт на реконструкции»).
  3. Если файла нет — просто пишет Access Denied.
  4. Важно: Вызывает exit, чтобы выполнение кода Битрикса и листинг страницы прекратились немедленно.

Как это использовать (Пример внедрения)

Обычно такой код вызывается в файле local/php_interface/init.php или в prolog модуля:

$checker = new \Xpage\Core\SiteClosed();

if (!$checker->userHasAccess()) {
$checker->showClosedPage();
}

Резюме преимуществ:

  1. Гибкость: Можно дать доступ по IP, по паролю или просто залогинившись под админом.
  2. Удобство разработки: Автоматическое определение локальной среды.
  3. Надежность: Учитывает CLI-запросы (чтобы не сломать обмен с 1С или отправку писем на кроне).
  4. Безопасность: Использование современных функций хеширования для Cookie.

Совет: Чтобы дать кому-то доступ к закрытому сайту, просто отправьте ему ссылку: https://mysite.ru/?openingCode=ТОТ_САМЫЙ_КОД. После одного перехода у него установится кука, и он сможет ходить по всем страницам.