Все ключи массива $_SERVER в PHP: что значит каждый и как с ним работать

$_SERVER — это готовый массив в PHP, который сервер заполняет для каждого запроса. В нём лежит всё, что сервер знает про запрос: кто пришёл, откуда, какой метод использовал, какой домен запросил, какие заголовки прислал клиент и т. д.

Массив суперглобальный: доступен в любом месте скрипта. Но не все ключи есть всегда: их набор зависит от веб‑сервера (Apache, Nginx), ОС и настроек. Поэтому всегда проверяй наличие ключа: либо isset(), либо через ??.

php
$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.
    Пример проверки:

    php
    if (($_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:

php
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: правила и примеры

  1. Всегда проверяй наличие ключа. Не пиши $_SERVER['X'] напрямую — будет Notice.
    php
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
  2. Не доверяй заголовкам. X‑Forwarded‑For, Referer, User‑Agent легко подделать.
  3. Не используй значения из $_SERVER в SQL без подготовленных выражений. Даже IP может быть неожиданным.
  4. Не выводи значения из $_SERVER в HTML без экранирования. Это прямой путь к XSS.
    php
    echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? '', ENT_QUOTES, 'UTF-8');

Практические функции

Получить IP клиента (с учётом прокси, но безопасно)

php
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 текущей страницы

php
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‑инъекции. Только подготовленные выражения.

Добавить комментарий