Управление типом контента в PHP через HTTP заголовки
Основы управления заголовком 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', если заранее не контролируется вывод.