$_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 закрывающий тег ?> необязателен и часто опускается для предотвращения случайного вывода пробельных символов.