Грозни информационни заглавки. Какво представляват Http заглавките?

Грозни информационни заглавки. Какво представляват Http заглавките?

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

Какво означава тази грешка?

За да разберете причините за грешката, първо трябва да разберете какво представляват тези „заглавия“.

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

Какви команди причиняват тази грешка?

Грешка „Не може да се промени информацията в заглавката – заглавките вече са изпратени от“може да извиква PHP команди като header, setcookie и други, свързани с работата на бисквитки или сесии.

Причини и решения за грешката.

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

Но програмистите, особено начинаещите, просто забравят или дори не знаят това. И първо се опитват да покажат нещо на страницата - най-често с командата echo, след което задават бисквитки, изпращат хедъри и т.н. Което води точно до тази грешка.

Ето пример за код, който би довел до тази грешка:

Ето правилния вариант:

Тоест, първо, не можете да показвате нищо, преди да изпратите заглавките!

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

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

Ето пример за неправилно задаване на заглавки:

Това е, второ, преди

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

Ето пример за такъв неправилен код:

Изпратено от Чет, 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 .

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

_____________
Математически факултет на ВСУ и други класики =)

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

Удивително е как една малка грешка може да направи вашия 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 ackages -> Празно пространство -> Премахване на празно пространство в края.

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

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

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

В заключение

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

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

Автор

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

Това съобщение за грешка често се среща от програмисти, които започват да използват 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 скриптът е записан в този формат, тогава този байт ще бъде възприет като част от изхода на тялото на страницата, което не трябва да се допуска, за да избегнем проблема, който обмислят.

Хората постоянно идват при мен с тази грешка и питат: " Къде е грешката?През целия период от време получих около няколко подобни писма 500 , не по-малко. Време е да приключим с грешката "". В тази статия ще говоря за причините за тази грешка, както и как да я отстраня.

Ако преведете тази грешка на руски, ще получите нещо подобно: " Не може да се промени заглавката, защото вече са изпратени"Какво е това" заглавки"? Нека да го разберем.

Когато сървърът върне отговор на клиента, различен от тялото (например, HTML кодстраници), има и заглавия. Те съдържат кода за отговор на сървъра, бисквитка, кодиране и много други параметри на услугата. Мога PHP скриптизпрати заглавие? Разбира се, че може. Има функция за това заглавка ().

Тази функция, например, се използва постоянно, когато. Тази функция също се използва редовно за.

Освен това заглавките се променят при изпращане бисквиткаи в началото на сесията (функция session_start()).

А сега защо грешката все още се появява? Сървърът винаги дава първо заглавките на сървъра, а след това тялото. Ако сървърът вече е върнал заглавките, тогава тялото отива и след това среща някои session_start(). Оказва се, че нещастният програмист е забравил да изпрати заглавките преди началото на тялото и сега иска да настигне влака, който вече е тръгнал.

Ето кода с грешката "":



?>

Разбира се, такива глупости PHPне прощава. И трябваше да бъде написано така:

session_start(); // Да започнем сесията
?>

Този скрипт няма да причини никакви грешки, тъй като първо се изпращат всички заглавки и едва след това се генерира тялото на отговора на сървъра.

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

echo "Здравей!"; // Отпечатайте нещо
session_start(); // Да започнем сесията
?>

Същото нещо, по някаква причина първо се показва тялото (или част от него) и след това се сетиха, че трябва да променят и заглавките.

Какъв е правилният начин за пренаписване този код, мисли за себе си.

Друг пример:




изход;
?>

Когато авторът на такъв код се провали, той е изненадан от тази грешка и казва: „Това е много странно съвпадение, когато операцията е успешна, всичко е наред, а когато има някаква грешка, те ми казват Не мога да променя информацията в заглавката - заглавки вече изпратено." Не буквално, но това е смисълът.

Проблемът е същият и правилният начин да го напишете е:

$грешка = вярно; // Имаше ли грешки?
if ($error) echo "Възникна грешка";
else header("Местоположение: ".$_SERVER["HTTP_REFERER"]); // Пренасочване назад
изход;
?>

Има и фини грешки:

header("Местоположение: ".$_SERVER["HTTP_REFERER"]); // Пренасочване назад
изход;
?>

Грешката в този код възниква поради интервал, който присъства преди . Пространството е нормален символ и е част от отговорното тяло. И когато сървърът го види, той заключава, че няма да има повече заглавки и е време да изведе тялото.

Има и следните грешки, които са от същото естество. Да кажем, че има файл a.html:

require_once "a.html";
header("Местоположение: ".$_SERVER["HTTP_REFERER"]); // Пренасочване назад
изход;
?>

И човекът искрено се учудва, откъде идва грешката, ако не е извел нищо? Следователно не е необходимо да търсите специално 1 файл и всички файлове, които са включени в него. И в тези, които са свързани с тези, които са свързани, също трябва да погледнете, така че да няма изход.

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

Наистина се надявам, че тази статия ще помогне за решаването на абсолютно всички проблеми, свързани с грешката „”, тъй като се опитах да подчертая всички проблеми, които възникват. И тогава трябва да обърнете главата си и да помислите какво не е наред във вашия код?