$_SERVER — это готовый массив в PHP, который сервер заполняет для каждого запроса. В нём лежит всё, что сервер знает про запрос: кто пришёл, откуда, какой метод использовал, какой домен запросил, какие заголовки прислал клиент и т. д.
Массив суперглобальный: доступен в любом месте скрипта. Но не все ключи есть всегда: их набор зависит от веб‑сервера (Apache, Nginx), ОС и настроек. Поэтому всегда проверяй наличие ключа: либо isset(), либо через ??.
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
Полный список самых важных ключей и что они значат
Ниже — ключи, которые реально пригодятся в работе, с коротким объяснением и примером.
Про клиента и IP
REMOTE_ADDR— IP‑адрес, который сервер видит напрямую.
Пример:192.168.1.55.REMOTE_HOST— имя хоста по IP (если включено разрешение имён). Часто не работает или медленно, лучше не использовать.REMOTE_PORT— порт клиента (обычно не нужен).HTTP_X_FORWARDED_FOR— цепочка IP через прокси (список через запятую). Подделывается, не годится для контроля доступа.HTTP_CF_CONNECTING_IP— реальный IP при Cloudflare.HTTP_X_REAL_IP— часто ставят в связке Nginx + Apache.
Правило безопасности: для принятия решений (доступ, бан) используй только
REMOTE_ADDR. Заголовки типаX‑Forwarded‑Forиспользуй только если сервер явно настроен доверять конкретному прокси.
Про метод, путь и параметры
REQUEST_METHOD— HTTP‑метод:GET,POST,PUT,DELETE,HEAD,OPTIONS.
Пример проверки:phpif (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') { /* ... */ }
REQUEST_URI— путь + query‑строка:/blog/post?id=123.SCRIPT_NAME— путь к скрипту:/blog/index.php.QUERY_STRING— только часть после?:id=123.PHP_SELF— имя текущего скрипта относительно корня документа. Часто используют в формах, но осторожно: может быть уязвим к XSS.PATH_INFO— часть пути после скрипта, но до query. Редко нужно.ORIG_PATH_INFO— оригиналPATH_INFOдо обработки сервером.
Про домен, протокол и хост
HTTP_HOST— заголовокHost: домен и порт (если не 80/443).
Пример:example.com:8080.HTTPS— признак HTTPS: пустая строка илиon.
Проверка:php$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
SERVER_PROTOCOL— версия протокола:HTTP/1.1,HTTP/2.SERVER_NAME— имя сервера (часто совпадает с доменом).SERVER_PORT— порт, на котором работает сервер:80,443,8080и т. п.
Про заголовки клиента (все начинаются с HTTP_)
Сервер превращает HTTP‑заголовки клиента в ключи вида HTTP_ИМЯ_ЗАГОЛОВКА: дефисы → подчёркивания, буквы → верхний регистр.
Примеры:
HTTP_USER_AGENT— User‑Agent (браузер, устройство, бот).HTTP_REFERER— откуда пришёл пользователь. Может отсутствовать.CONTENT_TYPE— тип тела запроса:application/json,multipart/form-data.CONTENT_LENGTH— длина тела запроса в байтах. Полезно для контроля размера загрузок.- Любые другие заголовки:
HTTP_X_CUSTOM_HEADER,HTTP_AUTHORIZATIONи т. д.
Пример: проверить, что запрос — JSON:
function isJsonRequest(array $server): bool { $ct = ($server['CONTENT_TYPE'] ?? '') ?: ($server['HTTP_CONTENT_TYPE'] ?? ''); return strpos($ct, 'application/json') === 0; }
Про сервер и окружение
SERVER_ADDR— IP‑адрес сервера.DOCUMENT_ROOT— корневая папка сайта на диске. Удобно для безопасных путей к файлам.php$path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/file.txt';
GATEWAY_INTERFACE— интерфейс CGI: обычноCGI/1.1.SERVER_SOFTWARE— ПО сервера: например,Apache/2.4.41илиnginx/1.20.1.SCRIPT_FILENAME— полный путь к файлу скрипта на диске:/var/www/example.com/index.php. Очень полезно для файловых операций.PATH_TRANSLATED— редко используется, лучше братьSCRIPT_FILENAME.
Специальные ключи про выполнение PHP
PHP_AUTH_USER— логин при HTTP‑авторизации (Basic Auth).PHP_AUTH_PW— пароль при HTTP‑авторизации.AUTH_TYPE— тип авторизации.
Эти ключи появляются только при использовании HTTP‑авторизации, иначе их нет.
Как безопасно работать с $_SERVER: правила и примеры
- Всегда проверяй наличие ключа. Не пиши
$_SERVER['X']напрямую — будет Notice.php$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
- Не доверяй заголовкам.
X‑Forwarded‑For,Referer,User‑Agentлегко подделать. - Не используй значения из $_SERVER в SQL без подготовленных выражений. Даже IP может быть неожиданным.
- Не выводи значения из $_SERVER в HTML без экранирования. Это прямой путь к XSS.
php
echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? '', ENT_QUOTES, 'UTF-8');
Практические функции
Получить IP клиента (с учётом прокси, но безопасно)
function getClientIp(array $server): string { // Если есть Cloudflare — это самый надёжный вариант if (!empty($server['HTTP_CF_CONNECTING_IP'])) { return trim($server['HTTP_CF_CONNECTING_IP']); } // X-Forwarded-For: может быть списком IP через запятую if (!empty($server['HTTP_X_FORWARDED_FOR'])) { $ips = explode(',', $server['HTTP_X_FORWARDED_FOR']); foreach ($ips as $ip) { $ip = trim($ip); if ($ip !== '' && $ip !== 'unknown') { return $ip; } } } // Fallback: прямой IP от сервера return $server['REMOTE_ADDR'] ?? ''; }
Получить полный URL текущей страницы
function getCurrentUrl(array $server): string { $scheme = (!empty($server['HTTPS']) && $server['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $server['HTTP_HOST'] ?? 'localhost'; $uri = $server['REQUEST_URI'] ?? '/'; return $scheme . '://' . $host . $uri; }
Частые ошибки
- Обращение к несуществующему ключу → Notice/Warning. Всегда
??илиisset(). - Доверие
X‑Forwarded‑Forдля прав доступа → уязвимость. - Вывод
$_SERVER['HTTP_REFERER']илиPHP_SELFв HTML безhtmlspecialchars()→ XSS. - Конкатенация значений
$_SERVERпрямо в SQL → SQL‑инъекции. Только подготовленные выражения.
