← Назад к вопросам

Какие знаешь заголовки в http запросе?

1.0 Junior🔥 171 комментариев
#API и веб-протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Заголовки HTTP-запроса: классификация и назначение

HTTP-заголовки — это метаданные запроса или ответа, передаваемые в виде пар "ключ-значение". Они позволяют клиенту и серверу обмениваться дополнительной информацией, управлять кешированием, аутентификацией, кодированием и другими аспектами взаимодействия. В PHP-разработке работа с заголовками осуществляется через суперглобальный массив $_SERVER (для входящих) и функции header()/setcookie() (для исходящих).

Основные категории заголовков запроса

  1. Общие заголовки (General Headers)
    Применяются как к запросам, так и к ответам:

    • Cache-Control — управление кешированием (no-cache, max-age=3600).
    • Connection — управление соединением (keep-alive, close).
    • Date — дата и время формирования сообщения.
  2. Заголовки запроса (Request Headers)
    Содержат информацию о клиенте и предпочтениях:

    • User-Agent — идентификатор клиентского приложения (браузер, библиотека).
    • Accept — допустимые MIME-типы ответа (application/json, text/html).
    • Accept-Language — предпочитаемые языки (ru-RU, en-US).
    • Accept-Encoding — поддерживаемые алгоритмы сжатия (gzip, deflate).
    • Authorization — данные для аутентификации (обычно Bearer <токен> или Basic <credentials>).
    • Host — имя хоста (обязателен в HTTP/1.1).
    • Referer — URL предыдущей страницы (часто используется для аналитики).
  3. Заголовки сущности (Entity Headers)
    Описывают тело запроса:

    • Content-Type — MIME-тип тела (application/x-www-form-urlencoded, multipart/form-data).
    • Content-Length — размер тела в байтах.
    • Content-Encoding — кодирование тела (gzip).

Пример работы с заголовками в PHP

Чтение входящих заголовков:
Большинство заголовков запроса доступны в $_SERVER с префиксом HTTP_ (например, User-Agent становится HTTP_USER_AGENT). Исключения — Content-Type и Content-Length, которые обрабатываются отдельно.

// Получение заголовков из $_SERVER
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'Неизвестно';
$acceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'ru';

// Специальные заголовки (без префикса HTTP_)
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
$contentLength = $_SERVER['CONTENT_LENGTH'] ?? 0;

// Альтернативный способ через apache_request_headers() (если доступно)
if (function_exists('apache_request_headers')) {
    $headers = apache_request_headers();
    $authorization = $headers['Authorization'] ?? '';
}

Отправка исходящих заголовков:
Используется функция header(), которая должна вызываться до любого вывода.

// Установка Content-Type для JSON-ответа
header('Content-Type: application/json; charset=utf-8');

// Реддирект с кодом 301
header('Location: /new-page', true, 301);

// Управление кешированием
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');

Практическое применение в backend-разработке

  • Аутентификация и авторизация:
    Заголовок Authorization с JWT-токенами стал стандартом для API. В PHP его можно обработать так:
$headers = getallheaders(); // Доступно не во всех конфигурациях
$authHeader = $headers['Authorization'] ?? '';
if (preg_match('/Bearer\s+(\S+)/', $authHeader, $matches)) {
    $jwtToken = $matches[1];
    // Декодирование и валидация токена
}
  • CORS (Cross-Origin Resource Sharing):
    Для API, доступных с разных доменов, необходимо устанавливать заголовки:
header('Access-Control-Allow-Origin: *'); // Или конкретный домен
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
  • Оптимизация производительности:
    Заголовки Accept-Encoding и Content-Encoding позволяют сжимать данные. В PHP можно использовать ob_gzhandler() для автоматического gzip-сжатия.

  • Безопасность:
    Заголовки безопасности, такие как X-Frame-Options (защита от кликджекинга), Content-Security-Policy (ограничение источников контента), часто устанавливаются на уровне веб-сервера, но могут управляться и из PHP.

Важные нюансы

  • Заголовки не чувствительны к регистру, но принято использовать Title-Case (User-Agent, Content-Type).
  • В PHP-FPM и Nginx некоторые заголовки (например, Authorization) могут требовать дополнительной конфигурации.
  • Функция header() не позволяет установить несколько заголовков с одинаковым именем — для этого нужно передавать строку со всеми значениями (актуально для Set-Cookie).

Понимание HTTP-заголовков критически важно для разработки RESTful API, интеграции с внешними сервисами и оптимизации взаимодействия клиента и сервера. В современном PHP-стеке (особенно с использованием PSR-7 и фреймворков) работа с заголовками абстрагирована, но знание их семантики остаётся фундаментальным.