Способы получения заголовков в PHP

Раздел: Веб-программирование -> Обработка HTTP-запросов

При работе с веб-приложениями на PHP часто возникает необходимость получить данные из HTTP-заголовков запроса - например, для анализа User-Agent, определения языка пользователя или проверки токена авторизации. В этой части рассмотрены основные способы доступа к заголовкам, начиная с самого универсального и заканчивая узкоспециализированными решениями.

Основные способы получения HTTP-заголовков

Самое надёжное и простое решение для большинства окружений - функция getallheaders(). Она возвращает ассоциативный массив всех заголовков HTTP-запроса, переданных клиентом.


<?php
$headers = getallheaders();
foreach ($headers as $name => $value) {
    echo "$name: $value\n";
}
?>
        

Php получить куки (получение куки в php)

Принцип работы:

  • Функция доступна, если PHP работает как модуль Apache (mod_php) или через Nginx с FastCGI (при наличии соответствующей опции).
  • Все имена заголовков возвращаются в исходном регистре (как их передал клиент).
  • Не требует ручного разбора переменных окружения.

Типичные проблемы и ошибки:

  • Функция не определена. Возникает в режиме CGI/FastCGI (например, на многих хостингах с PHP-FPM). В таких случаях альтернативой служит разбор $_SERVER.
  • Регистр ключей. В некоторых серверных окружениях все заголовки приводятся к нижнему регистру, что может нарушить ожидаемое поведение. Рекомендуется использовать регистронезависимый поиск или приводить ключи к одному регистру.
  • Пустой результат. Если запрос не содержит заголовков (крайне редко), возвращается пустой массив.

Как извлечь заголовки из суперглобального массива $_SERVER?

Когда getallheaders() недоступна, информацию можно получить из $_SERVER. Все заголовки запроса PHP помещает в этот массив с префиксом HTTP_.


<?php
$headers = [];
foreach ($_SERVER as $name => $value) {
    if (str_starts_with($name, 'HTTP_')) {
        $headerName = str_replace('_', '-', substr($name, 5));
        $headerName = ucwords($headerName, '-');
        $headers[$headerName] = $value;
    }
}
print_r($headers);
?>
        

Php получить html (получение html-кода в php)

Пояснение: из ключа HTTP_USER_AGENT удаляется префикс HTTP_, символы подчёркивания заменяются на дефис, а первая буква каждого слова переводится в верхний регистр. Получается стандартный вид User-Agent.

Возможные сложности:

  • Не все заголовки попадают в $_SERVER - например, заголовки с содержимым тела запроса (Content-Length, Content-Type) могут храниться под другими ключами (CONTENT_LENGTH, CONTENT_TYPE).
  • Сами ключи зависят от конфигурации сервера и могут быть переименованы.
  • Метод не подходит для получения заголовков, которые отсутствуют в запросе.

Как получить заголовки в окружении Apache с помощью apache_request_headers()?

Функция apache_request_headers() - аналог getallheaders(), но доступна только при работе через модуль Apache. Работает аналогично.


<?php
if (function_exists('apache_request_headers')) {
    $headers = apache_request_headers();
    // обработка
} else {
    // альтернативный способ
}
?>
        

Php получить заголовок (получение заголовка в php)

Рекомендуется проверять наличие функции перед вызовом, чтобы избежать фатальной ошибки.

Как прочитать заголовки напрямую из STDIN при обработке в CLI или нестандартном сценарии?

В некоторых приложениях (например, при интеграции с очередями или микросервисами) HTTP-запрос может поступать через STDIN. В таких случаях заголовки часто передаются в виде текста перед телом запроса.


<?php
$input = file_get_contents('php://input');
// Предполагается, что заголовки уже были извлечены ранее
// Например, если используется протокол CGI, то они доступны через переменные окружения
?>
        

Php получить json (получение json в php)

Этот метод редко применяется напрямую - обычно используются готовые библиотеки, которые парсят сырые входящие данные.

Как безопасно получить значение конкретного заголовка с помощью filter_input()?

Для единичного заголовка можно применить встроенную функцию фильтрации:


<?php
$userAgent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING);
echo $userAgent;
?>
        

Php получить адрес (получение адреса в php)

Пояснение: INPUT_SERVER обращается к $_SERVER, а третий аргумент применяет фильтр очистки. Это уменьшает риск XSS при выводе заголовка.

Недостаток:

Функция возвращает false, если заголовок не передан, что может быть неочевидно. Кроме того, фильтр может исказить данные (например, удалить небезопасные символы, которые могут быть нужны для логирования).

Как получить заголовки через PSR-7 объект Request (в фреймворках)?

Если проект использует современный фреймворк (Laravel, Symfony, Slim), то запрос обычно представлен объектом, реализующим PSR-7 интерфейс. Тогда заголовки извлекаются методом getHeaders() или getHeaderLine().


<?php
// Пример с использованием GuzzleHttp\Psr7\ServerRequest
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
$allHeaders = $request->getHeaders();
$acceptLang = $request->getHeaderLine('Accept-Language');
?>
        

Преимущество: объектный интерфейс, регистронезависимость, удобные методы для работы с множественными значениями.

- получить ссылку php (получение ссылки в php)
- Php получить код (получение кода страницы в php)
- получить get php (получение get-параметров в php)

Расширенные примеры работы с HTTP-заголовками

Ниже приведены примеры, демонстрирующие нестандартные и углублённые сценарии получения и обработки заголовков.

Пример 1. Получение всех заголовков с приведением ключей к нижнему регистру

Полезно для регистронезависимого поиска.

Пример

<?php
$rawHeaders = getallheaders();
$lowerHeaders = array_change_key_case($rawHeaders, CASE_LOWER);
print_r($lowerHeaders);
?>
    
Array
(
    [host] => localhost
    [user-agent] => Mozilla/5.0
    [accept] => text/html
    ...
)
    

Пример 2. Извлечение и парсинг заголовка Accept-Language

Определение предпочтительного языка клиента с учётом веса (q-фактор).

Пример

<?php
$acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
$langs = [];
foreach (explode(',', $acceptLang) as $part) {
    $parts = explode(';', trim($part));
    $locale = $parts[0];
    $q = 1.0;
    if (isset($parts[1]) && preg_match('/^q=(\d\.?\d*)$/', trim($parts[1]), $m)) {
        $q = (float)$m[1];
    }
    $langs[$locale] = $q;
}
arsort($langs);
$preferred = key($langs);
echo "Предпочтительная локаль: $preferred";
?>
    
Предпочтительная локаль: ru-RU
    

Пример 3. Проверка наличия заголовка X-Requested-With и ответ в JSON

Часто используется для определения AJAX-запросов.

Пример

<?php
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    $data = ['status' => 'success', 'message' => 'Это AJAX запрос.'];
    header('Content-Type: application/json');
    echo json_encode($data);
} else {
    echo 'Обычный запрос';
}
?>
    
{"status":"success","message":"Это AJAX запрос."}
    

Пример 4. Работа с множественными значениями одного заголовка (например, Set-Cookie в ответе)

Хотя getallheaders() показывает только последнее значение, можно получить все значения через headers_list() при установке заголовков ответа. Для входящих запросов множественные заголовки обычно приходят с разделителями запятыми.

Пример

<?php
// Для запроса: предположим, передан заголовок Accept: text/html, application/xhtml+xml
$accept = $_SERVER['HTTP_ACCEPT'] ?? '';
$values = array_map('trim', explode(',', $accept));
print_r($values);
?>
    
Array
(
    [0] => text/html
    [1] => application/xhtml+xml
)
    

Пример 5. Получение заголовков в среде без getallheaders (CGI) через $_SERVER с учётом Content-Type и Content-Length

Эти заголовки хранятся без префикса HTTP_.

Пример

<?php
$headers = [];
foreach ($_SERVER as $key => $value) {
    if (str_starts_with($key, 'HTTP_')) {
        $headers[substr($key, 5)] = $value;
    } elseif (in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH'])) {
        $headers[$key] = $value;
    }
}
print_r($headers);
?>
    
Array
(
    [HOST] => example.com
    [CONTENT_TYPE] => application/json
    [CONTENT_LENGTH] => 123
    ...
)
    

Получение заголовка в PHP - comments

En
Php получить заголовок (php)