Ошибки

PHP: Cannot modify header information - headers already sent — что делать

PHP уже начал отправлять страницу, а скрипт после этого попытался сменить заголовки ответа: сделать переадресацию или поставить cookie. Место, где начался вывод, PHP называет в скобках после output started at — там и ищите лишний символ.

≈ 6 мин чтения
Содержание 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 8
  • output 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найдите её в списке

Источники

Сверено 14 октября 2026 года.

Что почитать дальше