Решаване на проблема „Не може да се добави информация за заглавка – заглавки вече са изпратени“. Какво представляват Http заглавките (Http заглавките)

Решаване на проблема „Не може да се добави информация за заглавка – заглавки вече са изпратени“. Какво представляват Http заглавките (Http заглавките)

Днес решихме да поговорим какво означава посланието "Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от (изходът е започнал в /home/...", който се появи на страницата на сайта вместо основното му съдържание.
Както се оказа, мрежата е написала достатъчно по тази тема, но няма обобщена инструкция какво означава всичко това и как да се отървете от него.
Решихме да добавим няколко капки към огромното море от информация по тази тема, тъй като лично се сблъскахме с този проблем.

Преди известно време извършихме прехвърляне на няколко клиентски сайта от един хостинг на друг.
Всичко мина добре, сайтовете бяха достъпни, но когато се опитате да отидете на админ. панел, след въвеждане на потребителско име и парола се появи бяла страница вместо контролния панел.
Проверих в други сайтове - същата работа.
За да разберете възможни причини, активирахме показване на грешки.
За да направите това, трябва да редактирате файла .htaccess, намиращ се в корена на сайта чрез FTP, като добавите реда към него:

php_flag display_errors включен

След това при влизане в админ панела се появиха няколко съобщения като „Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от (изходът е започнал от /home/.../functions.php:1552) в /home/.../ public_html /wp-login.php на линия 362" и т.н.

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


Заглавия (заглавки) е служебната информация на сървъра, на който се намира сайта. Преди браузърът да покаже съдържанието на сайта, той получава хедъри от сървъра, които показват различни данни: дали е активирано кеширане на страницата, нейното кодиране, тип съдържание на страницата и други. В системите за управление на съдържанието на сайта заглавията се формират от функции, разположени в различни файловесистеми.
Задължително условиеЗаглавията трябва да бъдат изпратени преди основното съдържание (контент) на страницата.


Ако съдържанието на сайта се предава преди заглавките, тогава възниква ситуация, за която сме предупредени от съобщението „Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от ...“

В какви ситуации може да се случи това? Както вече споменахме, в съвременните CMS хедърите са резултат от една или повече функции. Самата функция е част от кода, затворен между инициала и окончателно ?> етикети.

Всичко извън тези тагове се счита за съдържание на страницата.
По този начин, ако в началото на страницата има функции, които водят до изпратени заглавки, и получим съобщението "Предупреждение: Не може да се промени информацията за заглавката ...", тогава се оказва, че част от информацията, свързана със съдържанието на страницата, е изпратено от сървъра преди заглавките.

Какво представлява тази информация и как да я намерите. Най-често това са интервали и празни редове.

Интервал или празен низ се интерпретират като знаци за основното съдържание на страницата, така че част от основното съдържание идва преди заглавията и първо се изпраща до браузъра.

Трябва да изтеглите файловете, посочени в съобщенията "Предупреждение: Не може да се промени информацията в заглавката ..." на локален компютър, отворете в редактор на код (аз използвам NotePad++) и внимателно проверете за празни редовеи интервали:

В същото време има една важна функция, която може значително да увеличи времето за търсене на решение.
Файлът може да не съдържа празни редове и интервали, но ако е бил записан в UTF-8 кодиране, тогава външен знак в самото начало на документа може да бъде вмъкнат от редактора, в който е създаден файлът. Този символ е UTF-8 идентификатор, равен на интервал с нулева ширина, който може изобщо да не се показва в редактора, но на сървъра ще се възприема като основно съдържание и ще се показва преди заглавията.

За да се отървете от този идентификатор, трябва да запазите отново изтеглените файлове във формат UTF-8 без BOM(UTF-8 без BOM).

NotePad++ върши тази работа добре.

След тези действия и актуализиране на файловете на сървъра, съобщението трябва да изчезне и сайтът ще работи както обикновено.

Изпратено от Чет, 05/04/2017 - 12:55

Описание на конкретен проблем

След натискане на бутона се показва грешка:

Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от (изходът е започнал от C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10) в C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php на ред 12

Кодът е подобен на този в тази тема:

Експериментална мрежа

Изберете скрипт за изтегляне

Манипулатор на скриптове:

Кога се случва

Тип грешка (предупреждение):

Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от

Възниква, ако вече сте направили нещо, което изисква задаване на заглавки на браузъра и сега искате да ги презапишете с нови. Например, ако вече сте показали текста, тогава php излага заглавките (по-специално заглавката местоположение-- което показва дали да останете на заявената страница или трябва да отидете на друга страница и да получите отговор на заявката вече там), за да покаже на клиентския браузър (в неговия отговор) как да се държи.

Коренът на проблема

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

echo header($redirect);

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

Тоест, необходимо е да запазите манипулатора на скрипта от html - в края на краищата, всъщност той не извежда нищо сам, а просто го прехвърля на друг адрес - това е първото.

заглавка ($ пренасочване);

echo header($redirect);

Експериментирайте

Тъй като echo() всъщност пише на http тяло на отговора, а не в заглавки, и заглавката връща void (т.е. не връща стойности), както бе споменато по-горе, тогава няма смисъл да се използва echo(), но
Все пак предлагам да направите експеримент:

  1. премахнете html
  2. не премахвайте ехото

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

Нека преразгледаме причината

Тези. преди да извикате header() не трябва да се показва съдържание(какво пише в описанието на функцията: http://php.net/manual/ru/function.header...)

  • 1) нито с ехо
  • 2) не с помощта на обичайното изхвърляне на html-текст в браузъра.

В нашия случай, очевидно, ехото не влияе на нищо, но html в манипулатора наистина го прави.

проблемът беше решен

Премахнато по ваш съвет. HTML тагове. Сега пренасочването се извършва правилно, скриптът на манипулатора изглежда така:

Функцията ехо всъщност не влияе на работата, т.е. можете да го оставите като S. Holzner:

Освен това, когато проектирате кода за пренасочване, трябва да обърнете внимание на разширението на файла, към който се извършва преходът: с предложения синтаксис той трябва да бъде посочен в аргумента на заглавката.

  • Влезте, за да публикувате коментари

Но можете да го накарате да работи

Но можете да накарате и предишния манипулатор да работи

Пренасочване на потребителя

ако зададете опцията във файла php.ini

Изходно_буфериране = 4096

  • Влезте, за да публикувате коментари

Повторното изпращане на хедъри е забранено, HTTP протоколът не работи така! Но какво да правим тогава? Ако след изхода на страницата също трябва да стартирате сесията и да поставите бисквитката? - Не забравяйте за изходното буфериране.

Тоест, когато е зададен ненулев размер на буфера, докато не се напълни, все още е възможно да се манипулират заглавките. При нулев размер на буфера, след извеждане на съдържанието, неговото връщане веднага предшестванпредаване на заглавки на HTTP отговор към клиента.

И се оказва, че искаме да променим заглавките, които вече са „отлетели“ през мрежата към клиента (което означава, че вече не е възможно да ги коригираме - по-специално заглавката местоположение, което показва дали да останем на исканата страница или да поискаме друга - отговорът на скрипта "redirector" (в нашия случай това е манипулатор на форми) просто казва, че трябва да поискаме друга страница), за което php ни предупреждава .

Но:Разбира се, невъзможно е да се реши проблемът по този начин (не много правилно, по-точно).

_____________
matfak vgu и останалите класики =)

  • Влезте, за да публикувате коментари

Това съобщение за грешка често се вижда от програмисти, които започват с PHP. Разбирането защо възниква тази грешка ще ви помогне да намерите решение.

PHP върши голяма част от работата по генерирането на уеб страници вместо вас, без да питате. Уеб страницата има две части: заглавка и тяло.

Тази често срещана PHP грешка се наблюдава, когато програмист прави грешки при манипулиране или създаване на заглавки. Ето един пример:

Предупреждение: Не може да се промени информацията в заглавката – заглавките вече са изпратени от (изходът е започнал от /home/usr1/public_html/sent.php:42) в /home/usr1/public_html/includes/theme-header.php на ред 12

Като цяло не е нужно да се притеснявате за заглавката, тъй като тя се генерира автоматично и съдържа информация за страницата, сървъра и бисквитката. Информацията в заглавката е важна, но обикновено не се вижда от потребителя. Ето няколко примера:

Дата: Mon, 10 Jul 2006 18:51:59 GMT Сървър: 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 header, както е описано в тази статия.

Заглавката трябва да е първа в отговора от уеб сървъра и е отделена от тялото с един празен ред. Причината за тази грешка е, че част от тялото на уеб страницата вече е била изпратена на потребителя, преди да бъде направен опит за задаване на стойността на заглавката. Тъй като PHP прави много неща лесни за вас, проблемът може да се крие на обичайното място. Ето някои насоки за намиране на проблема:

  1. Намерете инструкцията header(), която причинява проблема. Грешката трябва да е на или преди този ред.
  2. Потърсете инструкции, които биха могли да насочат изхода към потребителя преди тази инструкция в заглавката. Ако намерите един или повече, променете кода, за да преместите израза на заглавката преди тях. Сложните условни изрази могат да усложнят проблема, но също така могат да помогнат за решаването му. Като алтернатива можете да приложите условие в горната част на PHP скрипта, което определя стойността на заглавката възможно най-рано и я задава там.
  3. Уверете се, че няма интервали извън началния и крайния PHP тагове. Докато празен ред преди началния маркер
  4. Ако запишете файла си в UTF-8 кодиране, уверете се, че файлът е записан без подпис (без BOM). Сигнатурата е байт, добавен в началото на файла, и ако PHP скриптът е записан в този формат, тогава този байт ще бъде възприет като част от изхода на тялото на страницата, което не трябва да се допуска, за да избегнем проблема, който обмислят.

В тази статия ще разгледаме за какво служат заглавките, без да навлизаме в подробности кой за какво отговаря. Описанието на ролите на най-често срещаните заглавия ще бъде дадено в следващите статии.

Всички статии от поредицата:

HTTPозначава HyperText Transfer Protocol (протокол за прехвърляне на хипертекст). Протоколът е набор от правила, по които различни устройства комуникират. Създадена е през 90-те години на миналия век. Сега се използва в интернет почти навсякъде. Всичко, което виждате в прозореца на браузъра, е получено чрез този протокол. http заглавките са може би основното нещо в комуникацията между устройствата. Те предават основна информация за връзката, която се установява, и за информацията, която се предава по тази връзка.
Нека да разгледаме комуникационната схема на двете устройства. Нека тези устройства са вашият компютър и някакъв сървър в Интернет:

Както можете да видите, браузърът изпрати http заявка. Може да изглежда така:

GET /other-19 HTTP/1.1
Домакин: www.scriptsite.ru
Потребителски агент: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Приемам: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Език за приемане: ru,en-us;q=0.7,en;q=0.3
Приемане на кодиране: gzip, deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep Alive: 300
Връзка: keep-alive

В този случай първият ред е низ за заявка, всички останали редове са http заглавки, които носят допълнителна информация за заявката, за клиента, който изисква тази информация и за много други неща.
В отговор на нашата заявка сървърът може да изпрати следните заглавки:

Сървър: Apache/2.0.61 (Unix) mod_ssl/2.0.61 OpenSSL/0.9.8k mod_dp20/0.99.2 PHP/5.2.5 mod_python/3.3.1 Python/2.5.1 mod_ruby/1.2.6 Ruby/1.8.6 (2007-09-24)

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=ft47gokfee6amv3eda3k1p93s3; път=/

Контрол на кеша: без съхраняване, без кеш, задължително повторно валидиране, последваща проверка=0, предварителна проверка=0

Pragma: без кеш

Keep Alive: изчакване = 10, максимум = 1024

Връзка: Keep Alive

Трансфер-кодиране: на парчета

Тип съдържание: текст/html

Първият ред е редът на състоянието. Останалите редове са заглавки. В схемата беше показано, че съдържанието на страницата също се зарежда. Но това съдържание обикновено не се показва в добавки, които преглеждат заглавки. А съдържанието на страницата е само частен случай. Според протокола страницата не трябва да се предава. Вместо това могат да се прехвърлят картина, звуков файл и видео. И всички те имат много различни заглавия.

Как да видя http заглавки?

За да видите http заглавките, препоръчвам следните добавки за браузъра firefox:

Ако използвате браузъра Chrome, можете да видите цялата информация, като щракнете върху бутона за настройки - инструменти - инструменти за разработчици. раздел мрежи.
Не мога да съветвам потребителите на браузъра opera, защото не съм приятел с този браузър. След като инсталирате добавките и ги стартирате, опитайте да опресните страницата. Веднага ще видите огромни списъци със заявки и отговори, чрез които вашият браузър комуникира със сървъра.

Http заглавки и достъп до тях в php

Ако сте php разработчик, можете да получите достъп до заглавките на заявките, като използвате функцията getallheaders(). За да разберете как работи, нека стартираме следния код:

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

Но по-често те са достъпни чрез глобалната променлива $_SERVER. Почти всеки http хедър има подобно име на елемент в тази променлива, образувано от принципа HTTP_header_name. Така че за същия 'User_Agent' има променлива $_SERVER['HTTP_USER_AGENT'];

За да получите заглавките, които сървърът ще изпрати на потребителя, използвайте функцията headers_list(). По правило сървърът съставя липсващите задължителни заглавки още в края на работата на всички скриптове. Следователно този масив ще съдържа заглавките, или тези, които сървърът е създал преди стартиране на изпълнението на скрипта (и те няма да бъдат променени), или тези, които сме задали ръчно. Можете да ги зададете ръчно, като използвате функцията header("заглавен текст");
Нека изпълним следния код:

Ще видим разпечатка на заглавките, готови за изпращане в момента на извикване на функцията:

Първият хедър е зададен автоматично и носи името на сървъра, на който се изпълнява скриптът. Вторият е инсталиран ръчно от нас. Ако браузърът се нуждаеше от заглавката „Fruit“, той щеше да я вземе от http отговора на сървъра и да я използва. Но тъй като нашият браузър не се нуждае от него, той просто игнорира реда, който не разбира.

http структура на заявка

Искането ни изглежда така:

Първият ред в него, както споменахме по-рано, е низът на заявката. Състои се от три части:

  • метод(метод) - показва какъв вид заявка. Най-често срещаните методи са: GET, POST, HEAD. Те ще бъдат обсъдени в следващия параграф.
  • път(път) – Това обикновено е частта от URL адреса, която идва след домейна. Например, ако въведете http://www.scriptsite.ru/about/ в адресната лента, стойността на пътя ще бъде /about/.
  • протокол(протокол) - Протоколът за използване. Обикновено се състои от "HTTP" и версията на протокола. Обикновено, в модерни браузъриизползва се версия 1.1

Следват заглавките под формата на низове във формата "Име: стойност".
Между другото, данните за бисквитките също се предават в тази заявка като една от заглавките. Повечето от тези редове не са задължителни. Заявката може да бъде сведена общо до два реда:

ВЗЕМЕТЕ /article/show/4/ HTTP/1.1

Домакин: scriptsite.ru

Методи за заявка

ВЗЕМЕТЕ

Заявката за получаване обикновено се използва за заявка на документ, като се предават някои параметри.
Това е основният метод, използван за получаване на html страници, изображения, css и JavaScript файловеи т.н.
Поради факта, че параметрите могат да бъдат всякакви и сървърът няма ограничения за начина им на обработка, методът за заявки за данни често се използва за прехвърляне на информация. Например, ще имаме форма като тази

В този случай тези параметри ще бъдат видими в адресната лента на браузъра.

ПУБЛИКУВАНЕ

Post е методът, използван за изпращане на данни към сървъра. Въпреки че можете да изпращате данни към сървъра чрез метода GET през адресната лента на браузъра, в повечето случаи е за предпочитане да използвате POST. Изпращането на големи количества данни чрез GET е непрактично. Освен това GET има някои ограничения, които не позволяват, например, да публикувам тази статия на моя сайт през един ред на браузъра. POST заявкинай-често се използва за изпращане на уеб формуляри. Нека модифицираме формуляра от предишния пример, като му дадем метод POST.

Удивително е колко малка грешка може да срине напълно вашия WordPress сайт. Говорим, разбира се, за добре познатото предупреждение за грешка на WordPress. Предупреждение: информацията в заглавката не може да се променя - заглавките вече са изпратени от pluggable.php. Ако сте един от тези, които са се сблъскали с тази грешка, значи сте попаднали на правилното място. В това ще обсъдим първо причината за появата на тази грешка и ще разгледаме решенията, които най-накрая ще решат проблема.

Какво ще се изисква

Преди да започнете, уверете се, че имате следното:

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

Как се появява информацията в заглавката Не може да се промени - заглавките вече са изпратени по грешка

Нека да разгледаме пример за тази грешка, за да разберем по-добре причините. Грешката обикновено се появява в следната форма:

Предупреждение: Не може да се промени информацията в заглавката - заглавките вече са изпратени от (изходът е започнал от /public_html/wp-content/plugins/my-plugin/my-function.php:#) в /public_html/wp-includes/pluggable.php на ред #

Както можете да видите, грешката споменава два файла. Първият файл (в нашия случай: моята функция.phpнастанен в /public_html//wp-content/plugins/my-plugin/) начело на заподозрените. Това е нашият персонализиран код, който има за цел да промени основната функционалност, предоставена от WordPress. Функционалността на ядрото е във файла pluggable.php(Основен файл на WordPress, непроменен за нито един WordPress инсталации). С други думи, проблемът е в първия файл, което пречи на втория файл да се изпълни правилно.

Основната причина за грешка е екстрата интервали в първия файл. Това са интервали в горната или долната част на файла, ненужни интервали навсякъде във файла или дори интервали в PHP таговете. . Между другото, поради факта, че програмистите могат (и обикновено го правят) по погрешка да вмъкнат допълнителни интервали в своя код, тази грешка се появява по-често, отколкото бихте очаквали. Редът #, посочен в съобщението за грешка, се отнася до местоположението на проблема - това ще ви помогне да отстраните проблема по-бързо и без суетене.

Поправката не може да промени информацията в заглавката - заглавките вече са изпратени от

Сега, след като знаете какво причинява грешката, можете да преминете към отстраняването й. Ще ви покажем две опции за отстраняване на проблема, които можете да опитате поотделно или на свой ред, ако отделните не са помогнали.

Вариант 1 - Редактиране на дефектния файл

Първото решение на грешката Предупреждение: информацията в заглавката не може да се променя– ръчна корекция на файл с грешка. Вече имате информацията, от която се нуждаете, за да откриете проблема в самото съобщение за грешка (не забравяйте, че това е първият файл в съобщението). Всичко, което се изисква, е да отворите този файл чрез FTP с помощта на клиент като FileZilla или чрез файлов мениджър.

По същество всичко, за което трябва да се погрижите тук, е да премахнете допълнителните интервали/празни редове във файла. Добро мястоза начало ще бъде редът #, споменат в съобщението за грешка. Оттам можете да продължите да анализирате останалата част от файла, търсейки други ненужни интервали или празни редове до самия край на документа.

Уверете се, че сте написали началния и крайния тагове на PHP правилно. Не трябва да има интервал преди или след етикета , същото като етикет ?> . Освен това последният ред от кода не трябва да завършва с интервал или допълнителен нов ред.

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


УЛИКА: В много текстови редакториможете автоматично да премахнете ненужните интервали. Например за премахване допълнителни пространствав редактора Atom изберете целия код и отидете на P пакети -> Празно пространство -> Премахване на крайно пространство.

Вариант 2 - Сменете дефектния файл

Разбира се, редактирането на редица файлове с грешки може да бъде трудно. Файловете може да са свързани с плъгин или тема, които току-що сте инсталирали на вашия сайт, или дори може да са основни файлове на WordPress.

Ако грешката наистина е причинена от плъгин или тема, всичко, което трябва да направите, е да го инсталирате отново. Това действие помага в повечето случаи. От друга страна, ако основният файл на WordPress е причината за грешката, най-доброто решение е да вземете чисто копие на WordPress и да замените файла с грешката във вашата инсталация със същия в работеща версия. Това ще гарантира, че дефектният файл е поправен първоначалното състояние, докато останалата част от инсталацията на вашия WordPress сайт ще остане безопасна и здрава. Сега просто презаредете страницата и се уверете, че грешката е коригирана.

В заключение

Независимо дали сте поставили кодов фрагмент във файл, добавили сте нов плъгин/тема или сте написали кода на ръка, съществува риск от допълнително празно пространство във файла. Тези на пръв поглед невинни пространства могат да бъдат грешка в WordPress Предупреждение: информацията в заглавката не може да се променя - заглавките вече са изпратени от.

В това ръководство разгледахме как да коригираме такива грешки и сега вашият сайт отново работи според очакванията. Още ръководства за WordPress можете да намерите тук.

Автор

Елена има професионалист техническо образованиев района информационни технологиии опит в програмирането на различни езици за различни платформи и системи. Тя е посветила повече от 10 години на уеб сферата, работейки с различни CMS, като Drupal, Joomla, Magento и разбира се най-популярната система за управление на съдържание днес - WordPress. Нейните статии винаги са технически и точни, независимо дали става въпрос за преглед на WordPress или как да настроите своя VPS сървър.