Руководство по работе с объектом Server в Битрикс D7

При работе с веб-приложениями на платформе 1С-Битрикс может возникнуть необходимость получать различную информацию о сервере — от адреса и порта до HTTP-хостов и запрошенного URI. Для решения подобных задач в 1С-Битрикс существует специальный класс \Bitrix\Main\Server, который расширяет функционал \Bitrix\Main\Type\ParameterDictionary.

Работа с объектом Server в 1С-Битрикс

В данной статье мы разберём, как пользоваться этим классом, какие методы он предоставляет и приведём примеры использования. Статья будет полезна как начинающим, так и опытным разработчикам, которые создают и поддерживают проекты на 1С-Битрикс.


1. Общая информация о классе Server

Класс Server располагается в файле:

bitrix/modules/main/lib/server.php

Он наследует функциональность от \Bitrix\Main\Type\ParameterDictionary, благодаря чему предоставляет методы для безопасного доступа к массиву $_SERVER и ряду дополнительных серверных переменных.

Основные задачи Server:

  1. Получение значений из суперGLOBALS-массива $_SERVER удобным и более «безопасным» способом.
  2. Предоставление специализированных методов для популярных параметров вроде DOCUMENT_ROOT, SERVER_NAME, HTTP_HOST, REQUEST_URI и т. п.
  3. Возможность фильтрации данных, если необходимо внести корректировки в значения (например, при модификации REQUEST_URI).

Как получить объект Server

Чаще всего объект Server извлекают из текущего контекста:

use Bitrix\Main\Context;

// Способ №1
$context = Context::getCurrent();
$server = $context->getServer();

// Способ №2 (более кратко)
$server = Context::getCurrent()->getServer();

Получив объект Server, вы можете использовать все методы, доступные этому классу, чтобы работать с информацией о сервере.


2. Конструктор класса

public \Bitrix\Main\Server::__construct(array $arServer)

Это нестатический метод, который вызывается при создании экземпляра класса. Обычно нет нужды создавать объект Server напрямую, так как он уже создаётся движком 1С-Битрикс и предоставляется через контекст. Однако, если вам по каким-то причинам нужно вручную создать объект, можете вызвать конструктор так:

$arServer = $_SERVER; // например, взяли текущий массив $_SERVER
$serverObj = new \Bitrix\Main\Server($arServer);

Внутри конструктора могут быть применены фильтры и дополнительные операции по приведению к единому формату (например, убираются лишние слэши в DOCUMENT_ROOT).


3. Ключевые методы Server

Ниже представлены наиболее востребованные методы класса \Bitrix\Main\Server с кратким описанием и примерами.

3.1. getDocumentRoot()

Описание: Возвращает значение DOCUMENT_ROOT — корневую директорию сайта на сервере.

Пример:

$documentRoot = $server->getDocumentRoot();
echo $documentRoot;
// Например, выведет что-то вроде /var/www/html/bitrix

3.2. getPersonalRoot()

Описание: Возвращает папку BX_PERSONAL_ROOT. Если эта переменная на сервере не определена, по умолчанию возвращается строка /bitrix.

Пример:

$personalRoot = $server->getPersonalRoot();
// Если BX_PERSONAL_ROOT не задан, вернёт /bitrix

3.3. getHttpHost()

Описание: Возвращает HTTP-хост (HTTP_HOST).

Пример:

$httpHost = $server->getHttpHost();
echo $httpHost;
// Например, site.ru

3.4. getServerName()

Описание: Возвращает имя сервера (SERVER_NAME).

Пример:

$serverName = $server->getServerName();
echo $serverName;
// Может содержать, например, имя виртуального хоста.

3.5. getServerAddr()

Описание: Возвращает IP-адрес сервера (SERVER_ADDR).

Пример:

$serverAddr = $server->getServerAddr();
echo $serverAddr;
// Например, 127.0.0.1

3.6. getServerPort()

Описание: Возвращает порт сервера (SERVER_PORT).

Пример:

$serverPort = $server->getServerPort();
echo $serverPort;
// Например, 80 или 443

3.7. getRequestUri()

Описание: Возвращает запрошенный URI (REQUEST_URI). Содержит как путь, так и строку запроса, например /index.php/test1/test2?login=yes.

Пример:

$requestUri = $server->getRequestUri();
echo $requestUri;
// Например, /index.php/test1/test2?login=yes

3.8. getRequestMethod()

Описание: Возвращает метод HTTP-запроса (REQUEST_METHOD), например GET или POST.

Пример:

$method = $server->getRequestMethod();
if ($method === 'POST') {
    // Выполнить действия для POST-запроса
}

3.9. getPhpSelf()

Описание: Возвращает значение PHP_SELF. Оно может содержать путь к скрипту с дополнительными сегментами.

Пример:

$phpSelf = $server->getPhpSelf();
echo $phpSelf;
// Например, /index.php/test1/test2

3.10. getScriptName()

Описание: Возвращает значение SCRIPT_NAME. Как правило, это путь к исполняемому PHP-файлу (например, /index.php).

Пример:

$scriptName = $server->getScriptName();
echo $scriptName;
// Например, /index.php

3.11. Получение произвольных значений из $_SERVER

Любое значение, доступное в массиве $_SERVER, можно получить методом get, передав ключ:

$accept = $server->get('HTTP_ACCEPT');
$userAgent = $server->get('HTTP_USER_AGENT');

Данный подход удобен, когда нет специализированного метода в классе, но нужно получить конкретный заголовок или переменную сервера.


4. Практические примеры использования

Рассмотрим краткий пример, как можно применить методы класса Server на практике. Допустим, нам нужно в компоненте или в коде обработчика события вывести на экран некоторые сведения о сервере, а затем выполнить логику в зависимости от метода запроса:

use Bitrix\Main\Context;

$server = Context::getCurrent()->getServer();

// Получаем базовую информацию
$docRoot     = $server->getDocumentRoot();
$host        = $server->getHttpHost();
$serverName  = $server->getServerName();
$serverAddr  = $server->getServerAddr();
$serverPort  = $server->getServerPort();
$requestUri  = $server->getRequestUri();
$requestMethod = $server->getRequestMethod();

// Выводим для наглядности (на продакшене обычно логируем, а не выводим)
echo 'DOCUMENT_ROOT: '.$docRoot.'
'; echo 'HTTP_HOST: '.$host.'
'; echo 'SERVER_NAME: '.$serverName.'
'; echo 'SERVER_ADDR: '.$serverAddr.'
'; echo 'SERVER_PORT: '.$serverPort.'
'; echo 'REQUEST_URI: '.$requestUri.'
'; echo 'REQUEST_METHOD: '.$requestMethod.'
'; // Пример простой проверки if ($requestMethod === 'GET') { // Логика для GET-запроса echo 'Это GET-запрос'; } elseif ($requestMethod === 'POST') { // Логика для POST-запроса echo 'Это POST-запрос'; } else { // Логика для иных методов (PUT, DELETE и т.д.) echo 'Это другой метод HTTP-запроса'; }

5. Рекомендации и лучшие практики

  1. Используйте Context Вместо прямого доступа к глобальному массиву $_SERVER всегда лучше пользоваться методом Context::getCurrent()->getServer(). Так вы защищаете код от потенциальных изменений внутренних структур и получаете более безопасный интерфейс.
  2. Проверяйте значения Если необходимо работать с некоторыми переменными (например, HTTP-заголовками), проверяйте, что значение не пустое. При необходимости используйте isset($value) или более сложную логику валидации.
  3. Логируйте важные параметры При отладке или расследовании сбоев может пригодиться логирование значений из массива $_SERVER. Класс Server упрощает доступ к этим данным и помогает аккуратнее их обрабатывать.
  4. Не храните конфиденциальные данные в server-переменных Помните, что некоторые заголовки или пути могут содержать конфиденциальную информацию. Внимательно следите, чтобы не выводить такую информацию публично и не хранить в логах в открытом виде.
  5. Используйте фильтры Класс Server позволяет добавлять фильтры (метод addFilter). Это полезно, если нужно массово обработать (например, преобразовать, отфильтровать) входящие значения $_SERVER перед использованием в коде.

6. Заключение

Класс Server в 1С-Битрикс — это удобный инструмент для получения и управления данными, которые обычно хранятся в $_SERVER. Он упрощает доступ к часто используемым переменным, обеспечивает определённую безопасность и позволяет более элегантно писать код, соответствующий стандартам платформы.

Используя методы Server, вы сможете легко получать сведения о серверной среде, структуре запросов и HTTP-заголовках, а также при необходимости модифицировать их. Это особенно полезно при разработке комплексных решений, где важно чётко знать контекст выполнения скрипта или при создании интеграций и модулей для проектов на 1С-Битрикс.

Если вы ещё не применяли класс Server в своих проектах, попробуйте заменить прямой доступ к $_SERVER на использование методов, описанных в статье. Это сделает ваш код более надёжным, поддерживаемым и в духе «родных» практик 1С-Битрикс.

Теги:  руководство, D7

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.