PHP: Cannot modify header information - headers already sent — что делать
PHP уже начал отправлять страницу, а скрипт после этого попытался сменить заголовки ответа: сделать переадресацию или поставить cookie. Место, где начался вывод, PHP называет в скобках после output started at — там и ищите лишний символ.
Содержание 10
Как выглядит ошибка
PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/example.com/config.php:15) in /var/www/example.com/login.php on line 8output started at /var/www/example.com/config.php:15— файл и строка, где PHP начал выводить страницу. Это главное: причина там.in /var/www/example.com/login.php on line 8— где скрипт пытался отправить заголовок: переадресацию, cookie или код ответа.Warning— скрипт работает дальше, но заголовок не отправлен: не срабатывает переадресация, не сохраняется вход на сайт, не ставится cookie.
На сайте под nginx предупреждение попадает в журнал nginx: sudo tail -n 30 /var/log/nginx/error.log.
Почему так
Ответ сервера состоит из двух частей: сначала заголовки — код ответа, переадресация, cookie, — потом сама страница. Как только PHP отправил хоть один символ страницы, даже пробел или пустую строку, заголовки ушли вместе с ним. Поменять их уже нельзя, и PHP пишет это предупреждение.
Что искать на строке из output started at
| Что на этой строке | Что сделать |
|---|---|
строка 1, перед <?php пробел или пустая строка | удалите всё, что стоит до <?php: файл должен начинаться прямо с него |
| строка 1, а лишнего не видно | в начале файла невидимая метка BOM — как её убрать |
последняя строка файла, после ?> пустая строка | удалите ?> в конце файла — почему так лучше |
echo, print или кусок HTML | страница начала выводиться раньше времени: переадресацию и cookie нужно ставить до вывода — это правка кода |
Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне. Чтобы открыть файл сразу на нужной строке, поставьте перед его именем плюс и номер строки. -l включает номера строк слева:
sudo nano -l +15 /var/www/example.com/config.phpВместо 15 и пути подставьте номер строки и файл из своего сообщения. Сохраните файл: в nano — Ctrl+O, Enter, затем Ctrl+X. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
Прежде чем править файл, сохраните его копию в своей домашней папке:
cp /var/www/example.com/config.php ~/config.php.bakНевидимая метка BOM
Некоторые редакторы, сохраняя файл в кодировке UTF-8, записывают в его начало три невидимых байта — метку BOM. В редакторе её не видно, но PHP отправляет её в браузер как текст, и заголовки уходят раньше времени. Проверьте первые три байта файла:
head -c 3 /var/www/example.com/config.php | od -An -tx1Ответ ef bb bf значит, что метка есть. Уберите её — команда удаляет эти три байта только в начале первой строки:
sudo sed -i '1s/^\xEF\xBB\xBF//' /var/www/example.com/config.phpПовторите проверку: теперь в ответе будут первые символы <?php — 3c 3f 70. Если файл правите у себя на компьютере, сохраняйте его в кодировке UTF-8 без BOM.
Закрывающий тег в конце файла
Если файл содержит только код PHP, закрывающий тег ?> в его конце лучше не ставить. Так советует справка PHP: всё, что окажется после ?>, даже пустая строка, уйдёт в браузер как часть страницы. Без закрывающего тега лишним символам после кода неоткуда взяться.
Почему ошибка не на всех страницах
PHP может копить начало страницы в буфере и отправлять его порциями. Пока буфер не заполнен, заголовки ещё не ушли, и переадресация срабатывает. Размер буфера задаёт настройка output_buffering: в образце php.ini-production для рабочих серверов — 4096 байт. Посмотреть своё значение:
grep -n '^output_buffering' /etc/php/8.3/fpm/php.iniПоэтому ошибка может проявиться только там, где до переадресации выводится больше текста, или после переноса сайта на сервер, где буфер выключен. Поднимать буфер, чтобы спрятать ошибку, не стоит: найдите и уберите лишний вывод. Команды — для PHP 8.3 из Ubuntu 24.04. В Ubuntu 26.04 стоит PHP 8.5: в путях и командах вместо 8.3 пишите 8.5. Какая версия у вас, покажет ls /etc/php/.
Если файл из плагина или темы
Если в output started at стоит файл из папки плагина или темы, например wp-content/plugins/имя/, ошибка в нём. Проверьте обновление плагина или темы. Если файл вы правили сами — верните его из копии.
Ошибки рядом
| Что видите | Что делать |
|---|---|
Undefined variable или Undefined array key | предупреждения PHP 8 |
Call to undefined function | функции нет или не стоит модуль |
| другая ошибка PHP | найдите её в списке |
Источники
- Исходный код PHP 8.3.6: SAPI.c — тексты Cannot modify header information - headers already sent и POST Content-Length … exceeds the limit.
- Справка PHP: header() — заголовки отправляются до любого вывода, включая пустые строки в файле.
- Справка PHP: headers_sent() — как узнать, отправлены ли заголовки и где начался вывод.
- Справка PHP: теги PHP — в файле, где только код PHP, закрывающий тег лучше не ставить.
- Справка PHP: output_buffering — буфер вывода для всех файлов; число задаёт его размер в байтах.
- Файл php.ini-production из PHP 8.3.6 — значения для рабочих серверов: display_errors Off, log_errors On, max_execution_time 30, post_max_size 8M, upload_max_filesize 2M.
- GNU sed: Escapes — запись \xHH означает байт с шестнадцатеричным кодом HH.
- Справка nano для Ubuntu 24.04 — плюс и номер строки перед именем файла ставят курсор на эту строку.
Сверено 14 октября 2026 года.
Что почитать дальше
- Ошибки PHPкак читать сообщение и где журнал.
- Ошибка 500 Internal Server Errorесли вместо страницы ошибка 500.
- Как установить PHP на UbuntuPHP-FPM и где лежит php.ini.