Добавление заголовка в PHP: полный справочник с примерами
Добавление заголовка в PHP
Как отправить произвольный HTTP заголовок из PHP?
Основной способ установки любого заголовка ответа - использование функции header(). Она принимает строку заголовка в формате 'Имя: значение' и должна вызываться до любого вывода данных (включая пробелы и пустые строки).
header('Content-Type: application/json');
header('X-Custom-Header: MyValue');
echo json_encode(['status' => 'ok']);Php http response header (установка http заголовков ответа в php)
Функция header() заменяет заголовок с таким же именем, если он уже был установлен ранее. Для отправки нескольких одноимённых заголовков (например, Set-Cookie) используется третий аргумент $replace со значением false.
Типичная ошибка: вызов header() после вывода текста вызывает предупреждение 'Cannot modify header information - headers already sent'. Решение: размещать вызовы header() в самом начале скрипта, до любого вывода, либо использовать буферизацию вывода (ob_start()).
Как установить заголовок с кодом ответа (статусом)?
Второй аргумент функции header() - это код ответа HTTP. Например, для отправки 404:
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found"); // альтернативаPhp add header (добавление заголовка в php)
Или с использованием http_response_code():
http_response_code(404);
echo 'Страница не найдена';Функция http_response_code() удобна для установки кода без указания текстового сообщения.
Если код задан через header() после http_response_code(), приоритет имеет последний вызов. Для перенаправления (302) используется header('Location: ...') - он автоматически устанавливает код 302.
Как отправить заголовок для скачивания файла?
Пример принудительной загрузки файла:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="document.pdf"');
header('Content-Length: ' . filesize('path/to/file.pdf'));
readfile('path/to/file.pdf');Важно указать Content-Length для корректного отображения прогресса загрузки.
Если после readfile() есть ещё вывод, браузер может добавить данные к файлу. После отправки контента рекомендуется вызвать exit().
Как установить заголовки CORS для кросс-доменных запросов?
Пример разрешения доступа с любого источника:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');Для сложных запросов (preflight) заголовки отправляются отдельно в ответ на OPTIONS.
Некорректное значение Access-Control-Allow-Origin может привести к блокировке запроса. Для работы с учётными данными (cookies) нельзя использовать "*" - нужно указывать конкретный домен.
Как удалить ранее установленный заголовок?
Функция header_remove() удаляет заголовок по имени или все заголовки:
header('X-Powered-By: PHP');
header_remove('X-Powered-By'); // удалить один
// или
header_remove(); // удалить всеЭто полезно для скрытия информации о сервере.
header_remove() работает только с заголовками, установленными в текущем скрипте. Заголовки уровня веб-сервера (например, Server) этим способом не удалить.
Как добавить заголовок, если вывод уже начат (с буферизацией)?
Вариант с ob_start() в начале скрипта:
ob_start();
echo 'Текст перед заголовком';
header('Content-Type: text/html; charset=utf-8');
ob_end_flush(); // очищает буфер и отправляет выводВсе данные, выведенные до вызова header(), временно хранятся в буфере, и заголовки устанавливаются корректно.
Несколько вызовов ob_start() могут наслаиваться. Рекомендуется использовать один буфер на весь скрипт или ob_clean() для очистки.
Расширенные примеры установки заголовков
Пример 1: Форсированное обновление кэша браузера
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');Результат: браузер не будет кэшировать страницу.
(нет вывода; заголовки заданы)
Пример 2: Перенаправление с кодом 301 (постоянное)
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://new-site.com/page');
exit;Результат: браузер получит код 301 и перейдёт по новому адресу.
(страница не отображается, происходит редирект)
Пример 3: Установка заголовка Content-Security-Policy (безопасность)
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com");Результат: браузер заблокирует ресурсы из непроверенных источников.
(заголовок передан, поведение определяется браузером)
Пример 4: Отправка JSON ответа с правильным типом и кодировкой
$data = ['user' => 'Alice', 'age' => 30];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);Результат:
{"user":"Алиса","age":30}Пример 5: Использование header() для отправки нескольких Set-Cookie
header('Set-Cookie: session=abc123; path=/', false);
header('Set-Cookie: theme=dark; path=/', false);Результат: браузер получит два разных cookie.
(заголовки Set-Cookie добавлены)
Пример 6: Задание заголовка для потока (streaming)
header('Content-Type: video/mp4');
header('Content-Length: ' . filesize('video.mp4'));
header('Accept-Ranges: bytes');
readfile('video.mp4');Результат: браузер может запрашивать части файла (Range requests).
(видео воспроизводится с поддержкой перемотки)
Пример 7: Отключение кэширования для API
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: no-cache');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');Результат: промежуточные кэши (прокси) не будут сохранять ответ.
(заголовки установлены)
Пример 8: Использование header() вместе с http_response_code() для тестирования
http_response_code(200);
header('Content-Type: text/plain');
echo 'OK';
// проверка кода ответа
var_dump(http_response_code());Результат:
int(200) string(2) "OK"
Пример 9: Установка заголовка X-Content-Type-Options для защиты от MIME sniffing
header('X-Content-Type-Options: nosniff');Результат: браузер не будет определять MIME-тип по содержимому.
(безопасность повышена)
Пример 10: Комбинация заголовков для скачивания с именем на русском
$filename = 'отчёт.pdf';
$encoded = rawurlencode($filename);
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename*=UTF-8\'\'' . $encoded);
header('Content-Length: ' . filesize($filename));
readfile($filename);Результат: файл скачивается с корректным именем, содержащим кириллицу.
(браузер предлагает сохранить файл "отчёт.pdf")