Решение проблемы "Cannot add header information - headers already sent". Исправление ошибки: cannot modify header information – headers already sent by Безобразный information headers

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

С этой ошибкой ко мне постоянно обращаются и спрашивают: "Где ошибка? ". Подобных писем за всё время я получил где-то штук 500 , не меньше. Пора с ошибкой "" уже заканчивать. В этой статье я расскажу о причинах возникновения данной ошибки, а также о том, как её решить.

Если перевести данную ошибку на русский язык, то получится примерно следующее: "Нельзя изменить заголовок, поскольку они уже отправлены ". Что это за "заголовки "? Давайте разберёмся.

Когда сервер возвращает ответ клиенту, помимо тела (например, HTML-кода страницы), идут ещё и заголовки. В них содержится код ответа сервера, cookie , кодировка и множество других служебных параметров. Может ли PHP-скрипт отправить заголовок? Конечно, может. Для этого существует функция header() .

Данная функция, например, постоянно используется при . Также данная функция регулярно используется при .

Также заголовки модифицируются при отправке cookie и при начале сессии (функция session_start() ).

А теперь о том, почему же всё-таки возникает ошибка? Сервер всегда сначала отдаёт серверу заголовки, а потом тело. Если сервер уже вернул заголовки, потом пошло тело, и тут он встречает какой-нибудь session_start() . Оказывается горе-программист забыл отправить заголовки до начала тела, и теперь хочет догнать уже ушедший поезд.

Вот код с ошибкой "":



?>

Разумеется, такой бред PHP не прощает. И надо было писать так:

session_start(); // А давайте начнём сессию
?>

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

Другой пример кода с ошибкой:

echo "Hello!"; // Что-нибудь выведем
session_start(); // А давайте начнём сессию
?>

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

Как будет правильно переписать данный код, подумайте сами.

Ещё пример:




exit;
?>

Когда у автора такого кода, ничего не получается, он удивляется от этой ошибки и говорит: "Очень странное совпадение, когда операция проходит успешно, всё хорошо, а когда какая-то ошибка, мне сообщают Cannot modify header information - headers already sent". Не дословно, но смысл именно в этом.

Проблема та же самая, и правильно писать так:

$error = true; // Были ли ошибки?
if ($error) echo "Произошла ошибка";
else header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>

Есть и труднозаметные ошибки:

header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>

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

Бывают и следующие ошибки, имеющие всё ту же природу. Допустим есть файл a.html :

require_once "a.html";
header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>

И человек искренне удивляется, откуда ошибка, если он ничего не выводил? Поэтому смотреть надо не конкретно 1 файл, а все файлы, которые подключаются в нём. И в тех, что подключаются у подключаемых, тоже надо смотреть, чтобы не было вывода.

И последний момент, но уже более сложный. Оказывается, что иногда эта ошибка происходит и при правильном коде. Тогда всё дело в кодировке . Убедитесь, что кодировка файла "UTF-8 без BOM ", причём именно "без BOM ", а не просто "UTF-8 ". Поскольку BOM - это байты, идущие в самом начале файла, и они являются выводом.

Очень надеюсь, что данная статья поможет решить абсолютно все проблемы, связанные с ошибкой "", поскольку я постарался осветить все возникающие проблемы. А дальше надо включить голову, и подумать, а что в Вашем коде не так?

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

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. Для молодоженов подходящий сайт — организация банкетов и решение всех вопросов, связанных со свадьбой.

Сегодня мы решили рассказать о том, что значит сообщение «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++.

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

Это сообщение об ошибке часто встречают программисты, начинающие использовать PHP. Понимание того, почему возникает эта ошибка, поможет найти решение.

PHP делает много работы по генерации веб-страниц за вас, даже без вашей просьбы. Веб-страница состоит из двух частей: заголовка и тела.

Эта распространенная ошибка PHP наблюдается когда программист делает ошибки в манипуляции или создания заголовков. Вот пример:

Warning: Cannot modify header information – headers already sent by (output started at /home/usr1/public_html/sent.php:42) in /home/usr1/public_html/includes/theme-header.php on line 12

Как правило, вам не нужно беспокоиться о заголовке, так как он генерируется автоматически и содержит информацию о странице, сервере, и coockie. Информация в заголовке важна, но она обычно не видна пользователю. Вот несколько примеров:

Date: Mon, 10 Jul 2006 18:51:59 GMT Server: Apache/2.2.0 (Unix) mod_ssl/2.2.0 OpenSSL/0.9.7g Content-Encoding: gzip Content-Type: text/html

Иногда программисты хотят изменить некоторые значения заголовка. Например, если PHP генерирует XML вывод, Content-Type должен быть изменен, чтобы указать это. Другим распространенным примером является перенаправление браузера пользователя на другую веб-страницу с помощью элемента заголовка Location, как описано в этой статье .

Заголовок должен идти первым в ответе с веб-сервера и отделяется от тела одной пустой строкой. Причиной этой ошибки является то, что некоторая часть тела веб-страницы была отправлена ​​пользователю уже до того, когда делается попытка установить значение заголовка. Поскольку PHP упрощает многие вещи для вас, проблема может скрываться в обычном месте. Вот некоторые указания для нахождения проблемы:

  1. Найдите инструкцию header(), которая является причиной проблемы. Ошибка должна быть на или до этой линии.
  2. Посмотрите на любые инструкции, которые могли бы направить вывод пользователю до этой инструкции заголовка. Если вы обнаружили один или несколько, измените код, чтобы переместить инструкцию заголовка перед ними. Сложные условные операторы могут усложнить проблему, но они также могут помочь решить проблему. Как вариант можете применить условное выражение в верхней части сценария PHP, которое определяет значение заголовка как можно раньше, и устанавливает его там.
  3. Убедитесь, что нет пробелов за пределами начального и конечного PHP тэгов. В то время как пустая строка перед начальным тегом
  4. Если вы сохраняете ваш файл в кодировке UTF-8, то убедитесь, что файл сохраняется без сигнатуры (without BOM). Сигнатура — это байт, добавляемый в начале файла, и если PHP скрипт сохранить в таком формате, то этот байт будет воспринят как часть вывода тела страницы, чего нельзя допускать во избежание рассматриваемой нами проблемы.