ГЛАВНАЯ Визы Виза в Грецию Виза в Грецию для россиян в 2016 году: нужна ли, как сделать

Исправление ошибки: cannot modify header information – headers already sent by. Как найти и побороть BOM — неприятная ошибка в WordPress Неоплачиваемый information headers

Сегодня мы решили рассказать о том, что значит сообщение «Warning: Cannot modify header information — headers already sent by (output started at /home/...» , появившееся на странице сайта вместо его основного содержимого.
Как оказалось, в сети достаточно написано на эту тему, но нет обобщенной инструкции о том, что все это значит и как от этого избавиться.
Мы решили добавить несколько капель в огромное море информации на эту тему, поскольку столкнулись с данной проблемой лично.

Некоторое время назад мы осуществили перенос нескольких клиентских сайтов с одного хостинга на другой.
Все прошло нормально, сайты были доступны, но при попытке зайти в админ. панель, после ввода логина и пароля вместо панели управления появлялась белая страница.
Проверили на остальных сайтах — тоже самое.
Для того, чтобы узнать возможные причины, мы включили отображение ошибок.
Для этого необходимо по FTP отредактировать файл.htaccess, находящийся в корне сайта, добавив в него строку:

Php_flag display_errors on

После этого при входе в админ.панель появилось несколько сообщений вида «Warning: Cannot modify header information — headers already sent by (output started at /home/.../functions.php:1552) in /home/.../public_html/wp-login.php on line 362» и т.п.

В результате поисков была найдена информация, что это сообщение извещает о том, что информация заголовка не может быть изменена, потому что заголовки (информация о них) уже были ранее отправлены и далее в скобках указывалось какими именно строками в каких файлах это осуществлялось.


Заголовки (Headers ) — это служебная информация сервера, на котором расположен сайт. Перед тем, как браузер отобразит содержимое сайта, он принимает заголовки от сервера, где указываются различные данные: включено ли кэширование страницы, её кодировка, тип контента страницы и другие. В системах управления содержимым сайта заголовки формируются функциями, находящимися в различных файлах системы.
Обязательно условие — заголовки должны быть отправлены до основного содержимого (контента) страницы.


Если содержимое сайта передается до заголовков, то возникает ситуация, о которой нас предупреждает сообщение «Warning: Cannot modify header information — headers already sent by...»

В каких ситуациях это может возникать? Как уже говорили, в современных CMS заголовки являются результатом работы одной или нескольких функций. Сама функция это некий фрагмент кода, заключенный между начальным и конечным ?> тегами.

Все, что находится за пределами этих тегов считается контентом страницы.
Таким образом, если в начале страницы находятся функции, результатом работы которых являются отправляемые заголовки, и мы получаем сообщение «Warning: Cannot modify header information...», то получается что какая-то информация, относящаяся к контенту страницы отправляется с сервера до заголовков.

Что это за информация и как её найти. Чаще всего это пробелы и пустые строки.

Пробел или пустая строка интерпретируются как символы основного содержания страницы, поэтому получается, что часть основного контента находится перед заголовками и отправляется в браузер первой.

Нужно скачать файлы, указанные в сообщениях «Warning: Cannot modify header information...» на локальный компьютер, открыть в редакторе кода (я использую NotePad++) и внимательно проверить на наличие пустых строк и пробелов:

При этом есть одна важная особенность, которая может значительно увеличить время на поиски решения.
В файле может не оказаться пустых строк и пробелов, но если он был сохранен в кодировке UTF-8, то посторонний символ в самом начале документа может вставить редактор, в котором создавался файл. Этот символ — идентификатор UTF-8, равный пробелу с нулевой шириной, который в редакторе может вовсе не отображаться, но на сервере будет воспринят, как основное содержание и выведен до заголовков.

Для того, чтобы избавиться от данного идентификатора, необходимо пересохранить скаченные файлы в формат UTF-8 without BOM (UTF-8 без BOM).

С этой задачей отлично справляется NotePad++.

После этих действий и обновлений файлов на сервере, сообщение должно исчезнуть и сайт будет работать в привычном режиме.

Удивительно сколь малая ошибка может привести в полностью нерабочее состояние ваш сайт на WordPress. Мы говорим, конечно же, об известной ошибке-предупреждении WordPress Warning: cannot modify header information – headers already sent by pluggable.php (не удаётся изменить информацию заголовка) . Если вы один из тех, кто столкнулся с этой ошибкой, тогда вы пришли по адресу. В этом мы обсудим прежде всего причину появления этой ошибки и посмотрим на пути решения, которые позволят окончательно решить проблему.

Перед стартом убедитесь в наличии следующего:

  • Доступ к вашей панели управления хостингом или FTP доступ

Как возникает ошибка Cannot modify header information – headers already sent by

Давайте рассмотрим пример этой ошибки, чтобы лучше понять причины. Ошибка обычно появляется в такой форме:

Warning: Cannot modify header information - headers already sent by (output started at /public_html/wp-content/plugins/my-plugin/my-function.php:#) in /public_html/wp-includes/pluggable.php on line #

Как видите, в ошибке упоминается два файла. Первый файл (в нашем случае: my-function.php размещённый в /public_html//wp-content/plugins/my-plugin/ ) во главе подозреваемых. Это наш пользовательский код, который предназначен для изменения функциональности ядра, обеспечиваемой WordPress. Функциональность ядра находится в файле pluggable.php (файл ядра WordPress, неизменный для любой установки WordPress). Иными словами, проблема в первом файле, который не даёт второму файлу выполняться должным образом.

Основной причиной ошибки являются лишние пробелы в первом файле . Это пробелы вверху или внизу файла, ненужные пробелы где угодно в файле или даже пробелы в PHP-тегах . К слову, по причине того, что программисты могут (и обычно так и происходит) ошибочно вбивать лишние пробелы в свой код, эта ошибка наиболее часто возникает, чем можно ожидать. Строка #, указанная в сообщении об ошибке, ссылается на место расположения проблемы – это поможет устранить проблему быстрее и без суеты.

Исправление ошибки cannot modify header information – headers already sent by

Теперь, когда вы знаете, что вызывает ошибку, вы можете перейти к её исправлению. Мы покажем вам два варианта устранения проблемы, которые вы можете попробовать по отдельности или по очереди, если по отдельности не помогло.

Вариант 1 – Редактирования неисправного файла

Первый вариант решения ошибки Warning: cannot modify header information – ручное исправление файла с ошибкой. Вы уже имеете в наличии необходимую информацию, для нахождения проблемы в самом сообщении об ошибке (помним, это первый файл в сообщении). Всё, что потребуется – это открыть этот файл по FTP, используя клиент вроде FileZilla или через файловый менеджер .

По существу, всё, о чём здесь нужно позаботиться – это убрать лишние пробелы/пустые строки в файле. Хорошее место для начала будет строка #, упомянутая в сообщении об ошибке. С этого места вы можете продолжить разбор остального файла в поисках других ненужных пробелов или пустых строк до самого конца документа.

Убедитесь в правильности написания начального и завершающего тегов PHP. Не должно быть пробела до или после тега , также как и тега ?> . Также, последняя строка кода не должна завершаться пробелом или лишнем переводом строки.

На скриншоте ниже вы можете увидеть файл wp-config.php , в котором есть пробелы перед первым тегом PHP.

ПОДСКАЗКА : Во многих текстовых редакторах удалить ненужные пробелы можно автоматически. Например, для удаления лишних пробелов в редакторе Atom , выделите весь код и перейдите в Packages -> Whitespace -> Remove Trailing Whitespace .

Вариант 2 – Заменить неисправный файл

Конечно, редактирование целого ряда файлов с ошибками может вызвать затруднение. Файлы могут относиться к плагину или теме, которые вы только что установили на своём сайте или даже могут быть файлами ядра WordPress.

Если ошибка действительно вызвана плагином или темой, всё что потребуется сделать – это переустановить его/её. Это действие в большинстве случаев помогает. С другой стороны, если файл ядра WordPress причина ошибки, лучшим решением взять чистую копию WordPress и заменить файл с ошибкой в вашей установке на такой же в исправной версии. Это будет гарантировать, что неисправный файл восстановлен в исходное состояние, в то время как остальная установка вашего сайта WordPress останется в целости и сохранности. Теперь, просто перезагрузите страницу и убедитесь, что ошибка исправлена.

В завершение

Независимо от того, вставили ли вы фрагмент кода в файл, добавили новый плагин/тему или написали код вручную, существует риск появления лишних пробелов в файле. Эти, казалось бы невинные пробелы, могут обернуться ошибкой WordPress Warning: cannot modify header information – headers already sent by .

В этом руководстве, мы рассмотрели как исправлять такие ошибки, и теперь ваш сайт опять работает как и положено. Больше руководств по WordPress можно найти .

Как-то раз, зайдя на свой блог я с удивлением обнаружил непонятную ошибку, что-то вроде:

Warning: Cannot modify header information — headers already sent by (output started at /xxxxxxxx/wp-config.php:1)

Причем в админку зайти никак нельзя. Сразу же пошел проверять что не так с файлом wp-config.php. Все было на месте, пароли к БД правильные. Подумал было — снова хакнули)) Но опять же никаких признаков вандализма на FTP замечено не было. Самое странное (это меня в конце-концов окончательно запутало), что не работала только ссылка на сайт без www или наоборот (точно не помню). Начал стучать хостеру, смотреть настройки в админке домена — в общем, много чего.

А оказалось все намного проще — в начале файла конфига был некий BOM — маркер (сигнатура) для UTF-8 файлов. Именно поэтому выскакивала приведенная выше ошибка. Чтобы такого не случилось с вами в первую очередь нужно использовать редакторы кода, которые либо не ставят эту сигнатуру вообще, либо перед сохранением файла уточняют нужна ли она.

В некоторых текстовых редакторах вы можете найти в настройках флажки «Include Unicode Signature (BOM)», «Add Byte Order Mark» или подобные им. В противном случае, не имея возможности отключить ненужную опцию в той или иной программе, использовать ее не рекомендуется. На специализированных форумах можно найти список хороших текстовых редакторов, это — Notepad2, PSPad, UnicEdit, Notepad++ . О последнем вообще много пишут, достаточно мощный инструмент. У меня каким-то случайным образом на компа был в наличии альтернативный редактор — Akelpad — его для подобных задач и применяю.

Следует заметить вот еще какой момент — ошибка с BOM может быть не только в файле wp-config.php. Более того, при отключенной опции вывод предупреждений, вы вообще не увидите где закралась неполадка. В таких случаях (ну и всех других) я бы рекомендовал использовать простой скрипт для поиска файлов с BOM . За разработку следует поблагодарить Юрия Белотицкого .

Использование скрипта очень простое.

  1. нужный файлик
  2. Заливаете его на FTP сервер в корневую директорию. Если WordPress установлен не в корне сайта (а в папке blog, например), то скрипт нужно разместить в директорию, где лежит WordPress, и из нее же и запускать.
  3. Запуск очень простой — набираете в адресной строке броузера ссылку http://ваш.сайт/find_bom.php

В результате получите список файлов, которые являются неисправными. Кстати, для быстроты работы скрипт проверяет только те директории, куда пользователи, как правило, заливают файлы — корень, /wp-content/themes и /wp-content/plugins.

Вот, в принципе, и все. Как сложно пришлось решать такую простую проблему. Надеюсь, вам помог немного своим опытом, и теперь при появлении соответствующего предупреждения, вы будете знать, что делать:) Если не получается исправить тот или иной файл от BOM, можно просто залить новый из дистрибутива WordPress.

P.S. Для молодоженов подходящий сайт — организация банкетов и решение всех вопросов, связанных со свадьбой.

В этой статье мы рассмотрим основные причины и решения возникновения ошибки "Невозможно изменить заголовки - т.к. они уже были отправлены"("Cannot modify header information - headers already sent by ").

Что означает эта ошибка?

Чтобы разобраться с причинами возникновения ошибки, нужно сначала разобраться с тем, что такое эти "заголовки".

Не будем углубляться в теорию. Скажем лишь, что перед тем как любой пользователь открывает веб-страницу, ему посылаются эти самые "заголовки", которые содержат в себе кодировку, язык сайта, данные о сервере и прочую служебную информацию. Стоит так же отдельно добавить, что куки и сессия так же отправляются в заголовках.

Какие команды вызывают эту ошибку?

Ошибку "Cannot modify header information - headers already sent by" могут вызывать такие PHP -команды, как header , setcookie и другие, связанные с работой куки или сессий.

Причины и решения возникновения ошибки.

Самая частая ошибка происходит из-за не опытности. Мы уже разобрались, что заголовки отправляются до того, как начинает загружаться сама страница.

Но программисты, особенно начинающие попросту забывают или даже не знают этого. И сначала пытаются что-то вывести на странице - чаще всего при помощи команды echo , а потом устанавливают куки, посылают заголовки и т.д. Что приводит как раз к этой ошибке.

Вот пример кода, который приведет к такой ошибке:

А вот правильный вариант:

Т.е., во-первых, нельзя ничего выводить до отправки заголовков!

Не всегда это очевидно, но есть ошибка с небольшим различием. Это когда php-документ у вас начинается с пробелов или пустых строк, что подразумевает вывод в браузере этих строк.

За этим бывает очень сложно следить, так как например Windows блокнок может добавить вначале Byte Order Mark , никак нас не предупредив и даже не показывая этот символ. В этом случае стоит открыть документ при помощи других редакторов и проверить.

Вот пример по неправильному заданию заголовков:

Т.е., во-вторых, перед

Особо внимательным стоит быть, если вы используете команду include , по сути она объединяет все файлы и делает один результирующий, и если вы сначала подключили шапку сайта(слайдер, меню и т.д.) а потом в основном файле пытаетесь отправить заголовки, то у вас конечно вылезет эта ошибка.

Вот пример такого неправильного кода:

Submitted by on Thu, 05/04/2017 - 12:55

Описание частной проблемы

После нажатия на кнопку выводится ошибка:

Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10) in C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php on line 12

Код аналогичен приведённому в данной теме:

Экспериментальный Web

Выберите скрипт для загрузки

Скрипт-обработчик:

Когда это бывает

Ошибка (предупреждение) типа:

Warning: Cannot modify header information - headers already sent by

Возникает, если вы уже сделали что-то что требует установки заголовков браузера, а теперь хотите переписать их новыми. Например, если вы уже вывели текст - то php выставляет заголовки (в частности заголовок Location -- которые показывает оставаться ли на запрошенной странице или же нужно нужно перейти на другую страницу и уже там получить ответ на запрос), чтобы показаться браузеру клиента (в своём ответе) как себя вести.

Корень проблемы

Скорее всего, проблема в вашем случае состоит в том, что вы уже отдаёте контент (html-тэги которые перемешаны в файле со скриптом) до команды :

Echo header($redirect);

Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные . То есть она должна идти первой в выводе, перед ее вызовом не должно быть никаких HTML тэгов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании одиночного PHP/HTML файла.

То есть необходимо избавить скрипт-обработчик от html -- ведь он по сути сам ничего не выводит а просто перебрасывает на другой адрес -- это первое .

Header($redirect);

Echo header($redirect);

Эксперимент

Так как echo() вообще-то пишет в тело http ответа , а не в заголовки, а header возвращается void (то есть не возвращает значений), о чём было сказано выше , то смысла в использовании echo() нет, но
-- тем не менее, предлагаю провести эксперимент:

  1. уберите html
  2. не убирайте echo

Так как header() вызывается у вас по сути до echo() (так как header() является аргументом echo()) а значит возврат -- заодно проверим если функция возвращает null -- будет ли это интерпретироваться как пустая строка или же (что вернее) echo даже не начнёт работать как уже произойдёт редирект.

Ещё раз уточним причину

Т.е. перед вызовом header() не должен выводиться никакой контент (о чем написано к описанию функции: http://php.net/manual/ru/function.header...)

  • 1) ни с помощью echo
  • 2) ни с помощью обычного вываливания в браузер html-текста.

В нашем случае судя по всему echo не влияет ни на что, а вот html в обработчике очень даже влияет.

вопрос решился

По Вашему совету были удалены теги HTML. Теперь переадресация происходит корректно, скрипт-обработчик выглядит так:

Функция echo действительно не влияет на работу, т.е. можно оставить и как у С. Хольцнера:

Также при оформлении кода для редиректа следует обратить внимание на расширение файла, на который производится переход: при предложенном синтаксисе, оно должно быть указано в аргументе header.

  • Log in to post comments

Но можно заставить работать и

Но можно заставить работать и предыдущий обработчик

Перенаправление пользователя

если выставить в файле php.ini опцию

Output_buffering = 4096

  • Log in to post comments

Повторная отправка заголовков запрещена , HTTP - протокол так не работает! Но что ж делать то? Если после вывода на странице, нужно ещё и сессию стартануть и кУку поставить? - Вспоминаем про буферизацию вывода.

То есть когда выставлен ненулевой размер буфера, то пока он не заполнится ещё есть возможность манипулировать заголовками. При нулевом же размере буфера, после вывода контента, его отдача сразу же предваряется передачей клиенту заголовков http-ответа.

И получается, что мы хотим изменить заголовки, которые уже "улетели" по сети клиенту (а значит, исправить их уже невозможно -- в частности заголовок Location , который указывает оставаться ли на запрошенной странице, или запросить другую -- ответ скрипта-"перенаправителя" (у нас это обработчик формы) как раз говорит о том, что надо запросить другую страницу), о чем php нас и предупреждает.

Но: решать проблему таким способом конечно нельзя (не сильно корректно, точнее).

_____________
матфак вгу и остальная классика =)

  • Log in to post comments