Ошибка "Warning: Cannot modify header information"

Часто при переносе сайта с локального компьютера можно встретиться с ошибкой вида:

Warning: Cannot modify header information - headers already sent by (output started at …

Причины такой проблемы различные. Одни из самых распространенных это:

  1. лишние символы, пробелы в файле;
  2. из-за BOM в UTF.

C первой причиной все понятно - достаточно просто удалить лишние символы и проблема исчезнет.
А вот со второй проблемой намного интереснее.

Немного теории

BOM (англ. Byte Order Mark, BOM) - это метка порядка байтов Юникода, также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature).

По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8 - это и есть BOM.

А теперь займемся удалением BOM

Для того, чтобы удалить BOM из файлов, необходимо будет воспользоваться консолью (подключившись по SSH). Для подключения по SSH из Windows воспользуйтесь данной статьёй. Для поиска BOM'а в файлах сайта, можно использовать команду:

$ find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

Команда выведет список файлов, в которых были найдены BOM-символы.
Также можно воспользоваться данной командой:

$ grep -rl $'\xEF\xBB\xBF' .

А с помощью нижеприведенной команды можно найти метки порядка байтов и сразу же удалить их:

$ find . -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел "Помощь и поддержка".

Теги:

14
3962