Ответ
HTTP-заголовки — это ключевая часть протокола, управляющая передачей данных, кешированием, аутентификацией и метаинформацией. Вот основные группы и заголовки, с которыми я постоянно работаю:
Заголовки запроса (Client -> Server):
Host(Обязательный в HTTP/1.1): Указывает доменное имя и порт сервера. Nginx/Apache используют его для виртуального хостинга.Host: api.example.comUser-Agent: Содержит информацию о клиентском приложении (браузер, curl, мобильное приложение). Используется для аналитики и иногда для условного рендеринга.Accept: Сообщает серверу, какие типы контента (MIME types) клиент может понять. Основа для согласования контента (Content Negotiation).Accept: application/json, text/html;q=0.9Content-Type: Указывает MIME-тип данных, отправленных в теле запроса (для POST, PUT).Content-Type: application/jsonAuthorization: Передает учетные данные для аутентификации, чаще всего Bearer-токен.Authorization: Bearer eyJhbGciOiJIUzI1NiIs...Cookie: Передает cookies, установленные сервером ранее, обратно на сервер.
Заголовки ответа (Server -> Client):
Content-Type: Указывает MIME-тип данных в теле ответа.Content-Type: application/json; charset=utf-8Cache-Control: Директивы для управления кешированием как в браузерах, так и в промежуточных прокси. Самый важный заголовок для производительности.Cache-Control: public, max-age=3600 Cache-Control: no-cache, privateSet-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');