Обзор возможностей суперглобального массива $_SERVER в PHP

Суперглобальные массивы — это особые переменные в PHP, которые доступны во всех областях видимости без необходимости объявлять их глобальными. Одним из таких массивов является $_SERVER: он содержит ключевые данные о параметрах текущего HTTP-запроса, сервере и окружении исполнения скрипта.
Ниже перечислены все основные и дополнительные элементы массива $_SERVER, которые могут встречаться в PHP.
📌 Информация о сервере
-
SERVER_ADDR — IP-адрес сервера.
-
SERVER_NAME — доменное имя сервера.
-
SERVER_PORT — порт, на котором работает сервер.
-
SERVER_PROTOCOL — версия HTTP-протокола.
-
SERVER_SOFTWARE — информация о веб-сервере.
-
GATEWAY_INTERFACE — версия CGI-интерфейса.
📌 Информация о запросе
-
REQUEST_METHOD — HTTP-метод запроса.
-
REQUEST_URI — URI текущего запроса.
-
QUERY_STRING — строка параметров запроса.
-
REQUEST_TIME — время начала запроса (timestamp).
-
REQUEST_TIME_FLOAT — время начала запроса с микросекундами.
-
CONTENT_TYPE — тип содержимого запроса.
-
CONTENT_LENGTH — длина тела запроса.
📌 Пути и выполняемые скрипты
-
DOCUMENT_ROOT — корневая директория сайта.
-
SCRIPT_FILENAME — полный путь к файлу скрипта.
-
SCRIPT_NAME — путь к скрипту относительно корня.
-
PHP_SELF — путь к текущему скрипту.
-
PATH_INFO — дополнительный путь после имени скрипта.
-
PATH_TRANSLATED — физический путь PATH_INFO.
-
ORIG_PATH_INFO — исходный PATH_INFO.
📌 Информация о клиенте
-
REMOTE_ADDR — IP-адрес клиента.
-
REMOTE_PORT — порт клиента.
-
REMOTE_HOST — имя хоста клиента (редко используется).
📌 HTTP-заголовки (HTTP_*)
-
HTTP_HOST — домен сайта из заголовка Host.
-
HTTP_USER_AGENT — User-Agent браузера.
-
HTTP_ACCEPT — допустимые типы контента.
-
HTTP_ACCEPT_LANGUAGE — предпочитаемые языки.
-
HTTP_ACCEPT_ENCODING — поддерживаемые методы сжатия.
-
HTTP_CONNECTION — тип соединения.
-
HTTP_REFERER — страница-источник перехода.
-
HTTP_COOKIE — cookies клиента.
📌 HTTPS и прокси
-
HTTPS — используется ли HTTPS.
-
REQUEST_SCHEME — схема запроса (http / https).
-
HTTP_X_FORWARDED_FOR — IP клиента через прокси.
-
HTTP_X_REAL_IP — реальный IP клиента.
Важно: набор ключей $_SERVER зависит от веб-сервера, конфигурации PHP и типа запроса. Некоторые элементы могут отсутствовать.
Практическое использование
Массив $_SERVER часто используется для получения технической информации о текущем запросе и сервере. Например:
<?php
// Самый простой способ вывести конкретные данные
echo "Запрошенный скрипт: " . $_SERVER['PHP_SELF'] . "<br>";
echo "IP пользователя: " . $_SERVER['REMOTE_ADDR'] . "<br>";
echo "HTTP-метод: " . $_SERVER['REQUEST_METHOD'] . "<br>";
// Пример вывода всего массива $_SERVER
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
// Вывод через перебор массива
foreach ($_SERVER as $var => $value) {
echo "$var => $value<br>";
}
// Получение IP пользователя
$ip = $_SERVER['REMOTE_ADDR'];
echo "IP: $ip<br>";
// Адрес страницы
echo "URI: " . $_SERVER['REQUEST_URI'] . "<br>";
// Узнать браузер
printf("Your browser is: %s<br>", $_SERVER['HTTP_USER_AGENT']);
// HTTP протокол
echo "Протокол: " . $_SERVER['SERVER_PROTOCOL'] . "<br>";
// Текущий порт сервера
echo "Порт сервера: " . $_SERVER['SERVER_PORT'] . "<br>";
// Имя сервера
echo "HTTP_HOST: " . $_SERVER['HTTP_HOST'] . "<br>";
// Разрешенные хосты
$allowed_hosts = ['site.com', 'site.ua', 'site.com.ua'];
if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
exit;
}
// Порт подключения (редко используется)
if(isset($_SERVER['HTTP_PORT'])) echo "Порт подключения: " . $_SERVER['HTTP_PORT'] . "<br>";
// Схема запроса
echo "Схема: " . $_SERVER['REQUEST_SCHEME'] . "<br>";
// Время запроса к серверу
echo "Время запроса (timestamp): " . $_SERVER['REQUEST_TIME'] . "<br>";
// Пути на сервере
echo "DOCUMENT_ROOT: " . $_SERVER['DOCUMENT_ROOT'] . "<br>";
echo "PATH_INFO: " . ($_SERVER['PATH_INFO'] ?? '') . "<br>";
echo "SCRIPT_NAME: " . $_SERVER['SCRIPT_NAME'] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
// Авторизация HTTP
echo "AUTH_TYPE: " . ($_SERVER['AUTH_TYPE'] ?? '') . "<br>";
echo "REMOTE_USER: " . ($_SERVER['REMOTE_USER'] ?? '') . "<br>";
echo "PHP_AUTH_USER: " . ($_SERVER['PHP_AUTH_USER'] ?? '') . "<br>";
echo "PHP_AUTH_PW: " . ($_SERVER['PHP_AUTH_PW'] ?? '') . "<br>";
// HTTPS
echo "HTTPS: " . ($_SERVER['HTTPS'] ?? '') . "<br>";
echo "HTTP_X_HTTPS: " . ($_SERVER['HTTP_X_HTTPS'] ?? '') . "<br>";
echo "REDIRECT_HTTPS: " . ($_SERVER['REDIRECT_HTTPS'] ?? '') . "<br>";
// Проверка на https и редирект
if(($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') != 'https') {
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit();
}
// GET-параметры и URL
echo "QUERY_STRING: " . ($_SERVER['QUERY_STRING'] ?? '') . "<br>";
echo "REDIRECT_URL: " . ($_SERVER['REDIRECT_URL'] ?? '') . "<br>";
// Заголовки браузера
echo "HTTP_USER_AGENT: " . ($_SERVER['HTTP_USER_AGENT'] ?? '') . "<br>";
echo "HTTP_COOKIE: " . ($_SERVER['HTTP_COOKIE'] ?? '') . "<br>";
echo "HTTP_REFERER: " . ($_SERVER['HTTP_REFERER'] ?? '') . "<br>";
echo "HTTP_ACCEPT: " . ($_SERVER['HTTP_ACCEPT'] ?? '') . "<br>";
echo "HTTP_ACCEPT_ENCODING: " . ($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '') . "<br>";
echo "HTTP_ACCEPT_LANGUAGE: " . ($_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '') . "<br>";
echo "HTTP_ACCEPT_CHARSET: " . ($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '') . "<br>";
echo "HTTP_CONNECTION: " . ($_SERVER['HTTP_CONNECTION'] ?? '') . "<br>";
echo "HTTP_CACHE_CONTROL: " . ($_SERVER['HTTP_CACHE_CONTROL'] ?? '') . "<br>";
echo "HTTP_UPGRADE_INSECURE_REQUESTS: " . ($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'] ?? '') . "<br>";
Особенности и рекомендации
📍 Не доверяйте напрямую данным из заголовков.
Все ключи, начинающиеся с HTTP_, формируются на основе заголовков клиента — они могут быть подделаны. Поэтому для критичных задач (аутентификация, безопасность) данные нужно дополнительно проверять или фильтровать.
📍 Проверяйте существование ключей.
Перед использованием того или иного индекса массива $_SERVER рекомендуется проверять его наличие с помощью isset() или array_key_exists(). Это предотвратит ошибки на некоторых серверах.
📍 Используйте фильтры при работе с пользовательскими данными.
Если вы используете значения из $_SERVER в выводе или логике приложения (например, $_SERVER['HTTP_HOST']), применяйте фильтрацию через функции типа filter_var() или другие методы защиты. Это особенно важно при генерации ссылок или перенаправлений.
Заключение!
$_SERVER — один из главных инструментов для работы с информацией о запросе и окружении сервера в PHP. Он предоставляет быстрый доступ к широкому спектру данных, которые могут быть полезны при построении логики обработки запросов, отчётности, маршрутизации или анализа поведения пользователей. Правильное использование $_SERVER делает ваш код более гибким и информативным, но требует внимательного подхода к безопасности и проверке данных.Чтобы получить полный доступ, зарегистрируйтесь или войдите под своим именем.
