SiteClosed.php
Этот класс отвечает за функционал «Заглушки» (Site Maintenance mode). Позволяет закрыть публичную часть сайта от обычных посетителей, но при этом оставить доступ для разработчиков, администраторов и доверенных лиц.
Основная логика: метод userHasAccess()
Это «входная дверь». Метод проверяет, включена ли опция закрытия сайта в настройках модуля.
- Если выключена (
site_closed_active !== 'Y') — доступ разрешен всем (true). - Если включена — запускается цепочка проверок. Если хотя бы одна из них вернет
true, пользователь увидит сайт.
Цепочка проверок (условия исключения):
- Локальная разработка (
isLocalDeployment) — разработчик на своей машине всегда видит сайт. - Администратор (
isAdmin) — авторизованные админы Битрикса видят сайт. - Спец. разделы (
inSpecialUri) — папка/bitrix/или API-пути не должны блокироваться. - Консоль (
inCli) — скрипты на кроне (PHP CLI) должны работать беспрепятственно. - Секретный код/Cookie (
userDeviceHasAccess) — доступ по «секретной ссылке». - Белый список IP (
userIpHasAccess) — например, офис компании.
Подробный разбор механизмов доступа
А. Доступ по секретному коду
Метод userDeviceHasAccess позволяет дать доступ клиенту или тестировщику без IP и авторизации:
- Через URL: Если добавить к адресу параметр
?openingCode=ВАШ_КОД, класс проверит его. - Установка Cookie: Если код совпал, сайт генерирует «пропуск» (хеш пароля) и сохраняет его в куки браузера на 1 год.
- Безопасность: В куках хранится не сам секретный код, а его хеш (
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)
Если ни одна проверка не прошла, вызывается этот метод:
- Он ищет файл шаблона заглушки в папке модуля (
include/site_closed.php). - Если файл найден — подключает его (там может быть красивая верстка «Сайт на реконструкции»).
- Если файла нет — просто пишет
Access Denied. - Важно: Вызывает
exit, чтобы выполнение кода Битрикса и листинг страницы прекратились немедленно.
Как это использовать (Пример внедрения)
Обычно такой код вызывается в файле local/php_interface/init.php или в prolog модуля:
$checker = new \Xpage\Core\SiteClosed();
if (!$checker->userHasAccess()) {
$checker->showClosedPage();
}
Резюме преимуществ:
- Гибкость: Можно дать доступ по IP, по паролю или просто залогинившись под админом.
- Удобство разработки: Автоматическое определение локальной среды.
- Надежность: Учитывает CLI-запросы (чтобы не сломать обмен с 1С или отправку писем на кроне).
- Безопасность: Использование современных функций хеширования для Cookie.
Совет: Чтобы дать кому-то доступ к закрытому сайту, просто отправьте ему ссылку:
https://mysite.ru/?openingCode=ТОТ_САМЫЙ_КОД. После одного перехода у него установится кука, и он сможет ходить по всем страницам.