Установка заголовка Content-Type: text/plain с примерами
Установка заголовка Content-Type: text/plain в PHP
Как наиболее эффективно установить заголовок Content-Type: text/plain?
Самый прямой способ - вызвать функцию header() до любого вывода данных. Это единственный надёжный метод, гарантирующий, что браузер интерпретирует ответ как обычный текст.
<?php
header('Content-Type: text/plain');
echo 'Этот текст будет отображаться без HTML форматирования.';
?>Php header text (установка заголовка content-type: text/plain)
Цель: заставить браузер обрабатывать ответ как текстовый файл, а не как HTML. Полезно для вывода логов, CSV данных, простых ответов API.
Типичная ошибка: если после header() будет выведен пробел или другой символ до его вызова, PHP выдаст предупреждение 'Cannot modify header information'.
Решение: убедиться, что в файле нет пробелов перед <?php или после ?>, либо использовать буферизацию вывода с ob_start().
Как указать кодировку в заголовке Content-Type: text/plain?
Для корректного отображения не-ASCII символов необходимо добавить параметр charset.
<?php
header('Content-Type: text/plain; charset=utf-8');
echo 'Русский текст с UTF-8 кодировкой';
?>Php header charset (установка кодировки заголовка в php)
Цель: обеспечить правильную интерпретацию символов на стороне клиента.
Если фактическая кодировка данных не совпадает с указанной, браузер может отобразить кракозябры. Рекомендуется сохранять скрипт в UTF-8 без BOM.
Как избежать ошибки 'headers already sent' при использовании header()?
Использование буферизации вывода позволяет устанавливать заголовки после частичного вывода.
<?php
ob_start();
echo 'Некоторый контент';
header('Content-Type: text/plain');
ob_end_flush();
?>Цель: отложить отправку заголовков до полного формирования ответа. Подходит для случаев, когда невозможно избежать вывода до вызова header().
Буферизация увеличивает потребление памяти при большом объёме данных. Для длинных потоков рекомендуется использовать ob_flush() по частям.
Как переопределить уже установленный заголовок Content-Type?
Если заголовок был установлен ранее (например, фреймворком), его можно удалить и задать заново.
<?php
header_remove('Content-Type');
header('Content-Type: text/plain');
?>Цель: гарантировать, что в ответе будет именно text/plain, даже если другой код установил иное значение.
Функция header_remove() доступна с PHP 5.3. При её отсутствии можно установить пустое значение: header('Content-Type: ');, но это менее надёжно.
Как установить MIME-тип text/plain по умолчанию для всех скриптов?
С помощью ini_set можно задать глобальный MIME-тип до начала вывода.
<?php
ini_set('default_mimetype', 'text/plain');
// далее любой вывод будет интерпретироваться как text/plain
?>Цель: централизованная настройка, удобная для сайтов, целиком состоящих из текстового контента (например, генераторы документации).
ini_set('default_mimetype') переопределяет заголовок Content-Type, но может конфликтовать с другими заголовками, установленными позже. Эффективен только при отсутствии вывода до вызова.
Как заставить браузер скачать текстовый файл с заголовком Content-Type: text/plain?
Помимо установки MIME-типа, требуется заголовок Content-Disposition.
<?php
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="example.txt"');
readfile('file.txt');
?>Цель: принудительное скачивание содержимого как текстового файла, а не отображение в браузере.
Если не указать Content-Disposition, браузер может показать содержимое в окне. Также необходимо передавать правильные заголовки кэширования и размер.
Расширенные примеры установки Content-Type: text/plain
Пример 1. Комбинирование заголовков для скачивания сгенерированного текстового файла
Генерируется содержимое на лету, устанавливаются Content-Type, Content-Disposition и Content-Length.
<?php
$content = "Строка 1\nСтрока 2\nСтрока 3";
$filename = 'output.txt';
header('Content-Type: text/plain; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . strlen($content));
echo $content;
?>Результат: браузер загружает файл output.txt с указанным текстом. Заголовок Content-Length позволяет отображать прогресс загрузки.
HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="output.txt" Content-Length: 23 Строка 1 Строка 2 Строка 3
Возможная проблема: если файл слишком большой, может потребоваться вывод по частям с ob_flush и расчёт длины.
Пример 2. Автоматическая установка MIME-типа text/plain при возникновении ошибок
Создаётся пользовательский обработчик ошибок, который перехватывает вывод и устанавливает заголовок перед отправкой.
<?php
function customErrorHandler($errno, $errstr, $errfile, $errline) {
if (!headers_sent()) {
header('Content-Type: text/plain');
}
echo "Ошибка [$errno]: $errstr в файле $errfile на строке $errline\n";
exit();
}
set_error_handler('customErrorHandler');
// Провокация ошибки:
echo $undefinedVar;
?>Результат: при ошибке скрипт выдаёт чистый текст с описанием, без HTML-форматирования. Это полезно для отладки в консольных приложениях или API.
HTTP/1.1 200 OK Content-Type: text/plain Ошибка [8]: Undefined variable: undefinedVar в файле /path/to/script.php на строке 14
Замечание: обработчик не должен вызывать функции, которые снова могут вызвать ошибку. Рекомендуется использовать совместно с ob_start для гарантии, что заголовки не отправлены раньше.
Пример 3. Динамический выбор MIME-типа на основе расширения файла
Скрипт принимает параметр file и возвращает его содержимое с подходящим заголовком. Для .txt устанавливается text/plain.
<?php
$filename = $_GET['file'] ?? '';
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$allowedMimes = [
'txt' => 'text/plain',
'html' => 'text/html',
'json' => 'application/json'
];
if (array_key_exists($ext, $allowedMimes)) {
header_remove('Content-Type');
header('Content-Type: ' . $allowedMimes[$ext] . '; charset=utf-8');
readfile($filename);
} else {
header('Content-Type: text/plain');
echo "Неизвестное расширение файла: $ext";
}
?>Результат: при запросе script.php?file=readme.txt отдается Content-Type: text/plain. Для script.php?file=data.json - application/json. Если файл не найден или расширение не поддерживается, возвращается текст с ошибкой.
HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 [содержимое readme.txt]
Безопасность: использование readfile с неконтролируемым путём опасно. В реальном проекте нужно проверять путь относительно разрешённой директории.