Необъятный information headers. Что такое Http заголовки (Http headers)

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

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 send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent

Byte Order Mark
Иногда вы проверили ВСЁ - нигде ничего нет. Смените редактор. Посмотрите свой файл в другой программе. К примеру, Windows Блокнот при использовании кодировки Unicode добавляет в начало вашего файла служебный символ Byte Order Mark , никак при этом не ставя вас в известность. Откройте скрипт в другом редакторе и удалите посторонние символы. И смените Блокнот на другой редактор.
Или сохраняйте в кодировке UTF-8 without BOM

Многочисленные вопросы на форуме заставляют меня сделать здесь важное замечание:
Эта ошибка появляется не от того, что у вас в скрипте "что то написано выше". А от того, что РНР выводит что-то в браузер. Это не обязательно код. Это может быть сообщение об ошибке . может быть пробел или хтмл тег. Да-да. Для самых талантливых: речь идет о любом символе, отправленном в браузер, а не только о тех, которые браузер отображает неискушенному пользователю. У HTML страниц есть исходный текст. И именно он является результатом работы PHP скрипта, а не красивые буковки с картиночками, как думает очень большое количество людей.

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

В этой статье мы рассмотрим основные причины и решения возникновения ошибки "Невозможно изменить заголовки - т.к. они уже были отправлены"("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 , по сути она объединяет все файлы и делает один результирующий, и если вы сначала подключили шапку сайта(слайдер, меню и т.д.) а потом в основном файле пытаетесь отправить заголовки, то у вас конечно вылезет эта ошибка.

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

Это сообщение об ошибке часто встречают программисты, начинающие использовать 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 скрипт сохранить в таком формате, то этот байт будет воспринят как часть вывода тела страницы, чего нельзя допускать во избежание рассматриваемой нами проблемы.
Статьи по теме: