Управление типом контента в PHP через HTTP заголовки

Раздел: Основы PHP -> Управление заголовками

Основы управления заголовком Content Type в PHP

Наиболее эффективный способ задать тип контента в PHP - использовать функцию header() до любого вывода данных. Это гарантирует, что браузер или клиент правильно интерпретирует ответ сервера. Пример:

header('Content-Type: application/json');
echo json_encode(['status' => 'ok']);

Вызов header() должен происходить до отправки каких-либо данных (включая пробелы или HTML). Иначе возникает ошибка “Headers already sent”.

Типичная ошибка - вывод текста (включая пустые строки) перед header(). Решение: проверять, нет ли пробелов перед открывающим тегом <?php, или использовать буферизацию вывода (ob_start()).

Как задать тип контента для HTML страницы с кодировкой UTF-8?

header('Content-Type: text/html; charset=UTF-8');

Если не указать charset, браузер может неправильно интерпретировать кодировку, что приведет к кракозябрам.

Ошибка: забыли charset - клиент использует стандартную кодировку (обычно ISO-8859-1). Исправление: всегда указывать charset для текстовых типов.

Как заставить браузер скачать файл, а не отображать его?

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="document.pdf"');
readfile('document.pdf');

Первый заголовок устанавливает общий бинарный тип, второй говорит браузеру предложить сохранить файл.

Проблема: если не установить Content-Disposition, браузер может попытаться отобразить файл (например, PDF). Решение: всегда добавлять этот заголовок для загрузок.

Как передать изображение (PNG) через PHP скрипт?

header('Content-Type: image/png');
$img = imagecreatefrompng('image.png');
imagepng($img);
imagedestroy($img);

Этот подход используется для динамической генерации изображений.

Как установить несколько заголовков Content Type за один запрос?
header('Content-Type: application/json');
header('Content-Type: text/plain'); // последний перезаписывает

Можно вызывать header() несколько раз - последний заголовок с тем же именем заменит предыдущие. Для отправки нескольких значений одного заголовка (например, Set-Cookie) нужно использовать третий параметр false.

Ошибка: попытка отправить два разных Content-Type - браузер использует только последний. Решение: выбирать один тип, соответствующий содержимому.

Расширенные примеры работы с Content Type

Пример 1: Отправка JSON ответа с защитой от кэширования.

Пример
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
echo json_encode(['time' => time(), 'random' => rand()]);
{"time": 1712345678, "random": 42}

Пример 2: Принудительная загрузка CSV файла.

Пример
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="data.csv"');
$output = fopen('php://output', 'w');
fputcsv($output, ['Имя', 'Возраст']);
fputcsv($output, ['Анна', 25]);
fclose($output);
Имя,Возраст
Анна,25

Пример 3: Отправка XML с правильным типом.

Пример
header('Content-Type: application/xml; charset=utf-8');
$xml = new SimpleXMLElement('');
$xml->addChild('element', 'value');
echo $xml->asXML();
<?xml version="1.0"?>
<root><element>value</element></root>

Пример 4: Использование http_response_code() вместе с Content Type.

Пример
http_response_code(201);
header('Content-Type: application/json');
echo json_encode(['created' => true]);
HTTP/1.1 201 Created
Content-Type: application/json

{"created":true}

Пример 5: Очистка буфера перед установкой заголовков в случае уже выведенного содержимого.

Пример
ob_start();
echo 'Ненужный текст';
ob_clean(); // очищаем буфер
header('Content-Type: application/pdf');
readfile('document.pdf');
ob_end_flush();

Этот прием позволяет обойти ошибку 'headers already sent', если заранее не контролируется вывод.

Тип контента PHP - comments

En
Content type php (php)