Добавление заголовка в PHP: полный справочник с примерами

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

Добавление заголовка в 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")

Добавление заголовка в PHP - comments

En
Php add header (php)