Какие основные HTTP-заголовки (headers) используются в запросах и ответах?

«Какие основные HTTP-заголовки (headers) используются в запросах и ответах?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP-заголовки — это ключевая часть протокола, управляющая передачей данных, кешированием, аутентификацией и метаинформацией. Вот основные группы и заголовки, с которыми я постоянно работаю:

Заголовки запроса (Client -> Server):

  • Host (Обязательный в HTTP/1.1): Указывает доменное имя и порт сервера. Nginx/Apache используют его для виртуального хостинга.
    Host: api.example.com
  • User-Agent: Содержит информацию о клиентском приложении (браузер, curl, мобильное приложение). Используется для аналитики и иногда для условного рендеринга.
  • Accept: Сообщает серверу, какие типы контента (MIME types) клиент может понять. Основа для согласования контента (Content Negotiation).
    Accept: application/json, text/html;q=0.9
  • Content-Type: Указывает MIME-тип данных, отправленных в теле запроса (для POST, PUT).
    Content-Type: application/json
  • Authorization: Передает учетные данные для аутентификации, чаще всего Bearer-токен.
    Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
  • Cookie: Передает cookies, установленные сервером ранее, обратно на сервер.

Заголовки ответа (Server -> Client):

  • Content-Type: Указывает MIME-тип данных в теле ответа.
    Content-Type: application/json; charset=utf-8
  • Cache-Control: Директивы для управления кешированием как в браузерах, так и в промежуточных прокси. Самый важный заголовок для производительности.
    Cache-Control: public, max-age=3600
    Cache-Control: no-cache, private
  • Set-Cookie: Устанавливает cookie на стороне клиента.
  • Location: Используется с кодами 3xx (редирект) и 201 Created для указания URI нового ресурса.
  • ETag / Last-Modified: Используются для валидации кеша (условные запросы). Клиент может отправить If-None-Match (с ETag) или If-Modified-Since, чтобы проверить, изменился ли ресурс.

Общие заголовки (могут быть в запросе и ответе):

  • Content-Length: Размер тела сообщения в байтах.
  • Connection: Управление соединением (например, keep-alive).

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

// Отправка заголовков (до любого вывода)
header('Content-Type: application/json');
header('Cache-Control: no-store, max-age=0');

// Чтение заголовков запроса
$contentType = $_SERVER['HTTP_CONTENT_TYPE'] ?? ''; // Префикс 'HTTP_' для большинства заголовков
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';

// Использование встроенных функций для парсинга
if (strpos($contentType, 'application/json') !== false) {
    $data = json_decode(file_get_contents('php://input'), true);
}

// Работа с заголовками в контексте фреймворка (например, Symfony HttpFoundation)
$request = Request::createFromGlobals();
$acceptHeader = $request->headers->get('Accept');