Файл index.php в 1С-Битрикс: принципы работы и настройка

Раздел: Веб-разработка -> CMS и фреймворки

Основы работы с 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'; ?>

Результат: библиотеки работают внутри кода Битрикс. Проблема: конфликты автозагрузчиков – порядок подключения важен, классы Битрикс могут переопределяться.

1С-Битрикс (CMS) - comments

En
Bitrix index php (php)