W3docs

$_SERVER

PHP — популярный язык серверных сценариев. Узнайте о суперглобальной переменной $_SERVER и её ключах для работы с HTTP-запросами.

Суперглобальные переменные PHP и переменная $_SERVER

PHP — популярный язык серверных сценариев для веб-разработки. Одна из его особенностей — набор суперглобальных переменных, встроенных переменных, которые всегда доступны в любой области видимости, поэтому их не нужно объявлять с помощью ключевого слова global. В этой статье рассматривается суперглобальная переменная $_SERVER: что она содержит, какие ключи используются чаще всего, и как безопасно с ней работать.

Обзор всех суперглобальных переменных ($_GET, $_POST, $_SESSION, $_COOKIE и других) см. в разделе PHP Superglobals.

Что такое переменная $_SERVER?

$_SERVER — ассоциативный массив, который веб-сервер заполняет при каждом запросе. Он содержит информацию о сервере, текущем скрипте и входящем HTTP-запросе — заголовки, пути, метод запроса, IP-адрес посетителя и отдельные переменные окружения системы.

Поскольку это массив, отдельные фрагменты информации читаются по ключу, например $_SERVER['REQUEST_METHOD'].

Часто используемые ключи

КлючЧто возвращает
$_SERVER['REQUEST_METHOD']HTTP-метод запроса (GET, POST, PUT, …).
$_SERVER['REQUEST_URI']Путь и строка запроса запрошенного URL, например /products?id=5.
$_SERVER['QUERY_STRING']Только часть URL со строкой запроса, например id=5.
$_SERVER['HTTP_HOST']Хост (и порт) из заголовка Host запроса.
$_SERVER['SERVER_NAME']Имя хоста, настроенное на самом сервере.
$_SERVER['HTTPS']Не пустое значение, если запрос выполнен по HTTPS.
$_SERVER['REMOTE_ADDR']IP-адрес, с которого пришёл запрос.
$_SERVER['HTTP_USER_AGENT']Заголовок User-Agent клиента (идентификатор браузера/бота).
$_SERVER['HTTP_REFERER']URL страницы, с которой пришёл переход на текущий скрипт, если есть.
$_SERVER['SCRIPT_FILENAME']Абсолютный путь в файловой системе к выполняемому скрипту.
$_SERVER['DOCUMENT_ROOT']Корневой каталог документов, настроенный для сайта.
$_SERVER['PHP_SELF']Путь к текущему скрипту относительно корня документов.
$_SERVER['SERVER_PROTOCOL']Протокол запроса, например HTTP/1.1.

Примечание: Набор доступных ключей зависит от веб-сервера (Apache, Nginx + PHP-FPM, встроенный CLI-сервер, …). В командной строке многие ключи, связанные с запросами, полностью отсутствуют. Всегда читайте значения осторожно — см. раздел о безопасности ниже.

Просмотр $_SERVER

Если вы не уверены, что предоставляет то или иное окружение, выведите весь массив целиком:

<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';

Это выводит все пары ключ/значение, которые сервер предоставил для текущего запроса — это самый быстрый способ выяснить, на что можно рассчитывать.

Ветвление по методу запроса

Одно из самых распространённых применений $_SERVER — принятие решений в зависимости от способа запроса страницы. Например, страница с формой отображает её при GET-запросе и обрабатывает отправленные данные при POST-запросе:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Handle the submitted form data (validate, save, …)
    echo 'Processing your submission';
} else {
    // First visit — show the empty form
    echo 'Showing the form';
}

Этот шаблон лежит в основе обработки форм в PHP. Полный рабочий процесс описан в разделах PHP Form Handling и PHP Form Validation.

Формирование URL для перенаправления

Функция header() отправляет необработанный HTTP-заголовок — в том числе заголовок Location, используемый для перенаправлений. $_SERVER удобна для динамического формирования адреса назначения, например для принудительного перехода на HTTPS для текущего запроса:

<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('Location: ' . $url, true, 301);
    exit;
}

Функция header() должна вызываться до отправки любых данных браузеру (HTML, echo или даже пустая строка). Оператор exit останавливает скрипт, чтобы после заголовка перенаправления не генерировалось никакого дополнительного содержимого.

Использование $_SERVER для обработки ошибок

Ещё одно применение переменной $_SERVER — обработка ошибок. Например, следующий код отображает пользовательскую страницу ошибки для ошибок 404:

Обработка ошибки PHP 404 с помощью $_SERVER

<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>

В этом примере $_SERVER['REQUEST_URI'] используется для захвата запрошенного пути в целях логирования. Вместо перенаправления скрипт устанавливает правильный код состояния HTTP и подключает пользовательский шаблон — это стандартная практика обработки ошибок.

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

Некоторые ключи $_SERVER поступают из запроса и полностью контролируются клиентом, поэтому они могут быть подделаны. Обращайтесь с ними как с ненадёжными входными данными:

  • HTTP_HOST, HTTP_REFERER, HTTP_USER_AGENT и любой другой ключ HTTP_* — это просто заголовки запроса. Злоумышленник может отправить что угодно. Никогда не выводите их в HTML без экранирования (используйте htmlspecialchars()), а HTTP_HOST перед использованием в перенаправлении проверяйте по списку допустимых значений.
  • PHP_SELF может содержать внедрённые данные пути и является классическим источником межсайтового скриптинга (XSS) при выводе в атрибуте action формы. Экранируйте его.
  • REMOTE_ADDR — адрес подключения; за прокси-сервером или балансировщиком нагрузки реальный IP клиента может находиться в другом заголовке. Не полагайтесь только на REMOTE_ADDR при принятии решений, связанных с безопасностью.

Безопасный способ проверить отсутствующий ключ без предупреждения — оператор объединения с null:

<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;

Это позволяет избежать предупреждения «undefined array key», когда ключ не задан (например, при запуске через CLI).

Заключение

Суперглобальная переменная $_SERVER предоставляет PHP-скриптам доступ к информации о запросе и окружении — HTTP-методу, запрошенному URL, хосту, путям и IP-адресу посетителя. Она используется в повседневных задачах: обработке форм на основе метода запроса, перенаправлениях и логировании ошибок. Помните, что ключи, производные от заголовков, контролируются клиентом: проверяйте и экранируйте их перед использованием.

Для дальнейшего изучения рассмотрите связанные суперглобальные переменные: $_GET, $_POST и $_REQUEST.

Примечание: В современном PHP закрывающий тег ?> необязателен и часто опускается для предотвращения случайного вывода пробельных символов.

Практика

Практика
Какую информацию может предоставить суперглобальная переменная PHP $_SERVER?
Какую информацию может предоставить суперглобальная переменная PHP $_SERVER?
Was this page helpful?