Файл index.php в 1С-Битрикс: принципы работы и настройка
Основы работы с index.php в 1С-Битрикс
Файл index.php является точкой входа в систему 1С-Битрикс. Он подключает ядро CMS, определяет контекст выполнения и выводит страницу. Правильная настройка index.php критична для производительности и безопасности.
Как правильно организовать загрузку ядра Битрикс в index.php?
Наиболее эффективное решение – стандартная структура, предлагаемая разработчиками. Она включает подключение пролога, определение констант, загрузку ядра и вывод контента.
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
// Пользовательский код: проверка прав, инициализация
if (!$USER->IsAuthorized()) {
LocalRedirect('/auth/');
}
$APPLICATION->SetTitle('Главная страница');
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
<h1>Добро пожаловать</h1>
<p>Основной контент.</p>
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php';
?>
Гарантируется работа авторизации, сессий, буферизации вывода. Всегда используйте prolog_before и epilog.
Вариант: Кеширование в index.php
Для статичных блоков применяется встроенное кеширование через CPHPCache.
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
$cache = new CPHPCache();
$cacheTime = 3600;
$cacheId = 'main_page_content';
$cacheDir = '/S1/main/';
if ($cache->InitCache($cacheTime, $cacheId, $cacheDir)) {
$vars = $cache->GetVars();
$html = $vars['html'];
} else {
ob_start();
$APPLICATION->IncludeComponent('bitrix:news.list', 'main', array(...));
$html = ob_get_clean();
$cache->StartDataCache();
$cache->EndDataCache(array('html' => $html));
}
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
echo $html;
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php';
?>
Подходит для редко обновляемых блоков. Ошибка: сброс кеша не автоматический – добавляйте теги или очищайте вручную.
Как реализовать кастомный роутинг через index.php?
Битрикс поддерживает urlrewrite, но иногда требуется нестандартная логика, например, обработка AJAX.
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
$action = $_REQUEST['action'] ?? '';
if ($action === 'get_data') {
$result = array('status' => 'ok', 'data' => '...');
$APPLICATION->RestartBuffer();
echo json_encode($result);
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php';
die();
}
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
... HTML ...
<?php require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php'; ?>
После RestartBuffer обязательно завершайте выполнение скрипта. Типичная ошибка – забыть die().
Типичные проблемы и их решения
Ошибка подключения prolog_before.php – неверный путь $_SERVER['DOCUMENT_ROOT']. Решение: задайте константу BX_ROOT вручную или используйте реальный путь.
Предупреждение Cannot modify header information – вывод до пролога. Решение: проверьте на лишние пробелы или BOM, используйте ob_start().
Медленная загрузка index.php – избыточное подключение модулей в init.php. Решение: используйте выборочную загрузку через \Bitrix\Main\Loader::includeModule().
Расширенные примеры работы с index.php
Пример: Использование событий на старте страницы
Можно подписываться на события модуля main, например, OnPageStart, для выполнения кода до загрузки ядра.
// В файле init.php или в начале index.php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
// Регистрация обработчика
RegisterModuleDependences('main', 'OnPageStart', 'myModule', 'MyClass', 'handler');
class MyClass {
public static function handler() {
// Логирование, проверка IP, ограничение доступа
if ($_SERVER['REMOTE_ADDR'] == '192.168.1.1') {
header('HTTP/1.0 403 Forbidden');
die('Доступ запрещен');
}
}
}
// Продолжение обычного скрипта
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
Результат: при запросе с IP 192.168.1.1 пользователь увидит 403. Ошибка: если обработчик вызывает die до пролога, буфер не будет завершён корректно – используйте Prolog и Epilog только при обычном выводе.
Пример: Композитный кеш и подстановка динамических данных
Для страниц с композитным кешем (Bitrix Composite) используют специальные метки, чтобы заменять динамические блоки.
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
$APPLICATION->SetTitle('Страница с композитом');
// Отметить динамическую зону
$APPLICATION->AddBufferContent(function() {
$userId = \Bitrix\Main\Engine\CurrentUser::get()->getId();
return '<span id="user-name">Пользователь: '.$userId.'</span>';
});
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
<h1>Основной контент</h1>
<?php
// Автоматически вставится динамический блок
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php';
?>
Результат: основная страница кешируется, а блок с именем пользователя генерируется динамически. Проблема: неправильное использование AddBufferContent может привести к некорректному кешированию.
Пример: Обработка 404 ошибки в index.php
Если страница не найдена, можно перенаправить на 404 без стандартного urlrewrite.
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
$page = $_SERVER['REQUEST_URI'] ?? '/';
// Массив существующих страниц
$allowedPages = ['/', '/about/', '/contacts/'];
if (!in_array($page, $allowedPages)) {
// Отправить 404
header('HTTP/1.0 404 Not Found');
$APPLICATION->RestartBuffer();
$APPLICATION->SetTitle('Страница не найдена');
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
echo '<h1>Ошибка 404</h1><p>Страница не существует.</p>';
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php';
die();
}
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
... обычный контент ...
<?php require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php'; ?>
Результат: при запросе несуществующей страницы отдаётся код 404 и кастомный шаблон. Ошибка: если не использовать RestartBuffer, могут появиться дублирующие заголовки.
Пример: Подключение внешних библиотек через Composer в index.php
Если проект использует Composer, автозагрузку можно внедрить до пролога.
<?php
// Подключение автозагрузчика Composer (до Битрикса)
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php';
define('BX_UTF', true);
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
// Использование библиотеки, например, Monolog
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler($_SERVER['DOCUMENT_ROOT'].'/log/app.log'));
$log->info('Страница загружена');
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_after.php';
?>
... HTML ...
<?php require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog.php'; ?>
Результат: библиотеки работают внутри кода Битрикс. Проблема: конфликты автозагрузчиков – порядок подключения важен, классы Битрикс могут переопределяться.