Řešení problému "Nelze přidat informace záhlaví - záhlaví již odeslána". Oprava chyb: nelze upravit informace záhlaví - záhlaví již odeslal Oprava chyby nemůže upravit informace záhlaví - záhlaví již odeslal

Vložil Čt, 05.04.2017 - 12:55

Popis konkrétního problému

Po kliknutí na tlačítko se zobrazí chyba:

Upozornění: Nelze upravit informace v záhlaví - záhlaví již odeslaná (výstup začal na C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10) v C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php na řádku 12

Kód je podobný kódu uvedenému v tomto tématu:

Experimentální web

Vyberte skript ke stažení



Obslužný skript:



Kdy se to stane

Typ chyby (varování):

Upozornění: Nelze upravit informace v záhlaví - záhlaví již odeslal

Objeví se, pokud jste již provedli něco, co vyžaduje nastavení záhlaví prohlížeče, a nyní je chcete přepsat novými. Pokud jste například již zobrazili text, pak php nastaví záhlaví (zejména záhlaví Umístění-- který ukazuje, zda zůstat na požadované stránce nebo zda potřebujete přejít na jinou stránku a tam získat odpověď na požadavek), abyste prohlížeči klienta (ve své odpovědi) ukázali, jak se má chovat.

Kořen problému

S největší pravděpodobností je ve vašem případě problém, že již zobrazujete obsah (značky html, které jsou v souboru smíchány se skriptem) před příkazy:

Echo header($redirect);

Pamatujte, že funkci header() lze volat pouze v případě, že klient dosud nebyla přenesena žádná data. To znamená, že by měl být ve výstupu na prvním místě, před jeho voláním by neměly být žádné HTML značky, prázdné řádky atd. Poměrně často dochází k chybě, když při čtení kódu pomocí souborových funkcí, jako je include nebo require, jsou v tomto kódu mezery nebo prázdné řádky, které se vytisknou před voláním header(). Stejné problémy mohou nastat při použití jediného souboru PHP/HTML.

To znamená, že je nutné zbavit obsluhu skriptu html - koneckonců sám v podstatě nic nevypisuje, ale pouze přenese na jinou adresu - toto je první.

Header($redirect);

Echo header($redirect);

Experiment

Protože echo() obecně zapisuje do http tělo odpovědi, a ne v hlavičkách a hlavička vrací void (to znamená nevrací hodnoty), jak je uvedeno výše, pak nemá smysl používat echo(), ale
- přesto navrhuji provést experiment:

  1. odstranit html
  2. neodstraňujte ozvěnu

Vzhledem k tomu, že header() je v podstatě volána před echo() (protože header() je argument pro echo()) a proto vrací – zároveň zkontrolujeme, zda funkce vrací hodnotu null – bude interpretována jako prázdný řetězec resp. (které nebo spíše) echo ani nezačne fungovat, jakmile již k přesměrování došlo.

Znovu si ujasněme důvod

Tito. před voláním header() neměl by se zobrazovat žádný obsah(o čem se píše v popisu funkce: http://php.net/manual/ru/function.header...)

  • 1) ani s echem
  • 2) ne pouhým vyhozením html textu do prohlížeče.

V našem případě zřejmě echo nic neovlivňuje, ale html v handleru opravdu ano.

problém byl vyřešen

Na vaši radu byly odstraněny HTML tagy. Nyní k přesměrování dojde správně, skript obsluhy vypadá takto:

Funkce echo opravdu neovlivňuje provoz, tzn. Můžete to také nechat jako u S. Holznera:

Při psaní kódu pro přesměrování byste také měli věnovat pozornost příponě souboru, do kterého se přechod provádí: s navrhovanou syntaxí musí být uvedena v argumentu záhlaví.

  • Chcete-li psát komentáře, přihlaste se

Ale můžete to udělat

Můžete ale také nechat fungovat předchozí handler

Přesměrování uživatele

pokud nastavíte možnost v souboru php.ini

Output_buffering = 4096

  • Chcete-li psát komentáře, přihlaste se

Přeposílání hlaviček je zakázáno, protokol HTTP tak nefunguje! Ale co bychom měli dělat? Pokud po zobrazení na stránce potřebujete také zahájit relaci a nastavit cookie? - Vzpomeňme na ukládání do vyrovnávací paměti výstupu.

To znamená, že když je nastavena nenulová velikost vyrovnávací paměti, pak dokud není plná, je stále možné manipulovat s hlavičkami. Pokud je velikost vyrovnávací paměti nula, po výstupu obsahu je obsah okamžitě vrácen předcházelo předávání hlaviček HTTP odpovědí klientovi.

A ukázalo se, že chceme změnit hlavičky, které již „proletěly“ sítí ke klientovi (což znamená, že je již není možné opravit - zejména hlavičku Umístění, který ukazuje, zda zůstat na požadované stránce nebo požádat o jinou - odpověď skriptu „přesměrovač“ (pro nás je to obslužný program formuláře) pouze říká, že musíme požádat o další stránku), na což nás php varuje .

Ale: Samozřejmě takto (ne moc správně, přesněji) problém vyřešit nelze.

_____________
Matematická fakulta VŠU a další klasika =)

  • Chcete-li psát komentáře, přihlaste se

S touto chybovou zprávou se často setkávají programátoři, kteří začínají používat PHP. Pochopení, proč k této chybě dochází, vám pomůže najít řešení.

PHP dělá spoustu práce při generování webových stránek za vás, aniž byste se zeptali. Webová stránka se skládá ze dvou částí: hlavičky a těla.

Toto běžné Chyba PHP pozorováno, když programátor udělá chyby při manipulaci nebo vytváření záhlaví. Zde je příklad:

Upozornění: Nelze upravit informace v hlavičce – hlavičky již odeslané (výstup začal na /home/usr1/public_html/sent.php:42) v /home/usr1/public_html/includes/theme-header.php na řádku 12

Obvykle se nemusíte starat o záhlaví, protože je generováno automaticky a obsahuje informace o stránce, serveru a cookie. Informace v hlavičce jsou důležité, ale obvykle nejsou pro uživatele viditelné. Zde jsou nějaké příklady:

Datum: Po, 10. července 2006 18:51:59 GMT Server: Apache/2.2.0 (Unix) mod_ssl/2.2.0 OpenSSL/0.9.7g Kódování obsahu: gzip Typ obsahu: text/html

Někdy programátoři chtějí změnit některé hodnoty záhlaví. Pokud například PHP generuje výstup XML, musí být změněn Content-Type, aby se to projevilo. Dalším běžným příkladem je přesměrování prohlížeče uživatele na jinou webovou stránku pomocí prvku záhlaví Location, jak je popsáno v tomto článku.

Hlavička musí být v odpovědi z webového serveru na prvním místě a je oddělena od těla jedním prázdným řádkem. Důvodem této chyby je, že některá část těla webové stránky již byla odeslána uživateli před pokusem o nastavení hodnoty záhlaví. Protože vám PHP mnoho věcí zjednodušuje, problém může číhat na obvyklém místě. Zde je několik pokynů pro nalezení problému:

  1. Najděte příkaz header(), který způsobuje problém. Chyba musí být na tomto řádku nebo před ním.
  2. Před tímto příkazem záhlaví vyhledejte všechny pokyny, které by mohly směrovat výstup k uživateli. Pokud najdete jeden nebo více, změňte kód tak, aby se před ně přesunula instrukce záhlaví. Složité podmíněné příkazy mohou problém zkomplikovat, ale mohou také pomoci problém vyřešit. Případně můžete použít podmíněný výraz nahoře PHP skript, který co nejdříve určí hodnotu hlavičky a nastaví ji tam.
  3. Ujistěte se, že mimo počáteční a koncové značky PHP nejsou žádné mezery. Zatímco prázdný řádek před počáteční značkou
  4. Pokud soubor uložíte v kódování UTF-8, ujistěte se, že je soubor uložen bez podpisu (bez kusovníku). Podpis je bajt přidaný na začátek souboru, a pokud je PHP skript uložen v tomto formátu, bude tento bajt vnímán jako součást výstupu těla stránky, což by nemělo být povoleno, abychom se vyhnuli problému, který zvažují.

V tomto článku se podíváme na to, k čemu jsou hlavičky potřeba, aniž bychom zacházeli do podrobností o tom, kdo je za co zodpovědný. Role nejběžnějších nadpisů budou popsány v následujících článcích.

Všechny články ze série:

  • Co jsou hlavičky HTTP? Obecná teorie.

HTTP je zkratka pro HyperText Transfer Protocol. Protokol je sada pravidel, podle kterých si různá zařízení vyměňují data. Vznikl v 90. letech 20. století. Nyní se používá téměř všude na internetu. Vše, co vidíte v okně prohlížeče, bylo získáno prostřednictvím tohoto protokolu. http hlavičky jsou snad to hlavní v komunikaci mezi zařízeními. Předávají základní informace o navazovaném spojení a informace přenášené tímto spojením.
Podívejme se na komunikační schéma mezi oběma zařízeními. Nechte tato zařízení být vaším počítačem a nějakým serverem na internetu:

Jak vidíte, prohlížeč odeslal požadavek http. Mohlo by to vypadat nějak takto:

GET /other-19 HTTP/1.1
Hostitel: www.scriptsite.ru
User-Agent: 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)
Přijmout: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Přijímací jazyk: ru,en-us;q=0,7,en;q=0,3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0,7,*;q=0,7
Keep-Alive: 300
Spojení: keep-alive

V tomto případě je první řádek řádek požadavku, všechny ostatní řádky jsou hlavičky http, které nesou další informace o požadavku, o klientovi, který tyto informace požaduje, ao mnoha dalších věcech.
V reakci na náš požadavek může server odeslat následující hlavičky:

Server: 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. (2007-09-24)

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=ft47gokfee6amv3eda3k1p93s3; cesta=/

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Keep-Alive: časový limit=10, max=1024

Připojení: Keep-Alive

Transfer-Encoding: chunked

Typ obsahu: text/html

První řádek je stavový řádek. Zbývající řádky jsou záhlaví. Diagram ukázal, že je načten i obsah stránky. Tento obsah se však obvykle nezobrazuje v pluginech prohlížeče záhlaví. A obsah stránky je pouze speciální případ. Podle protokolu se stránka nemusí nutně přenášet. Místo toho lze přenášet obrázek, zvukový soubor a video. A všechny budou mít velmi odlišné nadpisy.

Jak zobrazit záhlaví http?

Chcete-li zobrazit záhlaví http, doporučuji následující pluginy pro prohlížeč firefox:

Pokud používáte prohlížeč Chrome, můžete si všechny informace zobrazit kliknutím na tlačítko nastavení – nástroje – nástroje pro vývojáře. Karta Sítě.
Nemohu poskytnout žádnou radu uživatelům prohlížeče Opera, protože s tímto prohlížečem nejsem přítel. Jakmile jsou pluginy nainstalovány a spuštěny, zkuste stránku obnovit. Okamžitě uvidíte obrovské seznamy požadavků a odpovědí, přes které váš prohlížeč komunikoval se serverem.

Http hlavičky a přístup k nim v php

Pokud jste vývojář PHP, můžete přistupovat k hlavičkám požadavků pomocí funkce getallheaders(). Abyste pochopili, jak to funguje, spusťte následující kód:

A dostaneme výtisk pole záhlaví.

Častěji se k nim ale přistupuje prostřednictvím globální proměnné $_SERVER. Téměř každá http hlavička má v této proměnné podobný název prvku, vytvořený podle principu HTTP_header_name. Takže pro stejného ‚User_Agent‘ existuje proměnná $_SERVER[‘HTTP_USER_AGENT‘];

K získání hlaviček, které se server chystá odeslat uživateli, se používá funkce headers_list(). Server zpravidla na konci všech skriptů doplní chybějící požadované hlavičky. Toto pole tedy bude obsahovat hlavičky buď ty, které server vytvořil před spuštěním skriptu (a nebudou se měnit), nebo ty, které jsme nastavili ručně. Lze je nastavit ručně pomocí záhlaví funkce ("text záhlaví");
Spusťte následující kód:

Uvidíme výtisk hlaviček připravených k odeslání v době volání funkce:

První hlavička byla nastavena automaticky a nese název serveru, na kterém skript běží. Druhý jsme nainstalovali ručně. Pokud by prohlížeč potřeboval hlavičku „Fruit“, vzal by ji z http odpovědi serveru a použil by ji. Ale protože to náš prohlížeč nepotřebuje, jednoduše ignoruje řádek, kterému nerozumí.

Struktura požadavku HTTP

Naše žádost vypadá takto:

První řádek v něm, jak již bylo zmíněno dříve, je řádek dotazu. Skládá se ze tří částí:

  • metoda(metoda) - udává, jaký typ požadavku. Nejběžnější metody: GET, POST, HEAD. O nich bude napsáno v dalším odstavci.
  • cesta(cesta) – obvykle se jedná o část adresy URL, která následuje za doménou. Pokud například do adresního řádku zadáte http://www.scriptsite.ru/about/, hodnota cesty bude /about/.
  • protokol(protokol) — použitý protokol. Obvykle se skládá z "HTTP" a verze protokolu. Obvykle v moderní prohlížeče používá se verze 1.1

Dále následují hlavičky ve formě řetězců ve formátu „Name: value“.
Mimochodem, v tomto požadavku jsou také přenášena data cookie jako jedna z hlaviček. Většina těchto řádků je volitelná. Dotaz lze zredukovat pouze na dva řádky:

GET /článek/zobrazit/4/ HTTP/1.1

Hostitel: scriptsite.ru

Metody požadavku

DOSTAT

Požadavek získat se obvykle používá k vyžádání dokumentu a předání některých parametrů.
Toto je hlavní metoda používaná k získání HTML stránek, obrázků, CSS a JavaScript souborů atd.
Vzhledem k tomu, že parametry mohou být jakékoli a server nemá žádná omezení ohledně jejich zpracování, často se k přenosu informací používá metoda data request. Budeme mít například takovýto formulář

V tomto případě budou tyto parametry viditelné v adresní řádek prohlížeč.

POŠTA

Post je metoda používaná k odesílání dat na server. Přestože můžete odeslat data na server pomocí metody GET prostřednictvím adresního řádku prohlížeče, ve většině případů je vhodnější použít POST. Odesílání velkého množství dat přes GET je nepraktické. GET má navíc některá omezení, která neumožňují například zveřejnění tohoto článku na mém webu pouze prostřednictvím jednoho řádku prohlížeče. Požadavky POST se nejčastěji používají k odesílání webových formulářů. Upravme formulář z předchozího příkladu, abychom mu dali metodu POST

Jednoho dne, když jsem šel na svůj blog, byl jsem překvapen, že jsem našel nepochopitelnou chybu, něco jako:

Upozornění: Nelze upravit informace v hlavičce — hlavičky již odeslané (výstup začal na /xxxxxxxx/wp-config.php:1)

Navíc neexistuje žádný způsob, jak vstoupit do panelu administrátora. Okamžitě jsem šel zkontrolovat, co je špatně se souborem wp-config.php. Vše bylo na svém místě, hesla k databázi byla správná. Myslel jsem, že to bylo znovu hacknuté)) Ale opět nebyly na FTP zaznamenány žádné známky vandalismu. Nejpodivnější (to mě nakonec úplně zmátlo) bylo, že nefungoval pouze odkaz na stránky bez www, nebo naopak (už si přesně nepamatuji). Začal jsem kontaktovat hostitele, podívat se na nastavení v panelu pro správu domény - obecně na spoustu věcí.

Ale ukázalo se, že je to mnohem jednodušší - na začátku konfiguračního souboru byl určitý kusovník— značka (podpis) pro soubory UTF-8. Proto se objevila výše uvedená chyba. Aby se vám to nestalo, musíte nejprve použít editory kódu, které tento podpis buď vůbec nevloží, nebo si před uložením souboru ujasní, zda je to potřeba.

V některých textové editory V nastavení najdete zaškrtávací políčka „Zahrnout podpis Unicode (BOM)“, „Přidat značku objednávky bajtů“ nebo podobná zaškrtávací políčka. V opačném případě, aniž byste mohli zakázat nepotřebnou možnost v konkrétním programu, se nedoporučuje ji používat. Na specializovaných fórech můžete najít seznam dobrých textových editorů, jsou to: Notepad2, PSPad, UnicEdit, Notepad++. Obecně se o tom druhém hodně píše, docela Výkonný nástroj. Nějak náhodou jsem to měl na skladě v počítači. alternativní editorAkelpad— Používám to pro podobné úkoly.

Dalším bodem, který stojí za zmínku, je, že chyba s kusovníkem může nastat nejen v souboru wp-config.php. Pokud je navíc vypnuta možnost zobrazování upozornění, vůbec neuvidíte, kam se problém vloudil. V takových případech (a všech ostatních) bych doporučil použít jednoduchý skript pro vyhledávání souborů s kusovníkem. Yuri Belotitsky by měl být poděkován za vývoj.

Použití skriptu je velmi jednoduché.

  1. požadovaný soubor
  2. Nahrajte jej na FTP server v kořenovém adresáři. Pokud není WordPress nainstalován v kořenovém adresáři webu (ale například ve složce blogu), pak je nutné skript umístit do adresáře, kde se WordPress nachází, a spustit odtud.
  3. Spuštění je velmi jednoduché - stačí zadat do adresního řádku prohlížeče odkaz http://your.site/find_bom.php

V důsledku toho získáte seznam souborů, které jsou vadné. Mimochodem, pro urychlení práce skript kontroluje pouze ty adresáře, kam uživatelé obvykle nahrávají soubory – root, /wp-content/themes a /wp-content/plugins.

To je v podstatě vše. Jak těžké to bylo vyřešit jednoduchý problém. Doufám, že jsem vám svými zkušenostmi trochu pomohl a teď, když se objeví odpovídající varování, budete vědět, co dělat :) Pokud nemůžete opravit ten či onen soubor z kusovníku, můžete jednoduše nahrát nový z kusovníku WordPress distribuce.

P.S. Vhodným místem pro novomanžele je pořádání banketů a řešení všech záležitostí souvisejících se svatbou.

Je úžasné, jak malá chyba může způsobit, že váš web WordPress bude zcela nefunkční. Řeč je samozřejmě o známé chybě varování WordPress Upozornění: nelze změnit informace v záhlaví — záhlaví již odeslaná pluggable.php (nelze změnit informace v záhlaví). Pokud jste jedním z těch, kteří čelí této chybě, pak jste na správném místě. V tomto budeme diskutovat o důvodu, proč se tato chyba objevuje na prvním místě, a podíváme se na řešení, která problém trvale vyřeší.

Co potřebuješ

Než začnete, ujistěte se, že máte následující:

  • Přístup k ovládacímu panelu vašeho hostingu nebo FTP přístup

Jak se objeví informace o hlavičce Nelze upravit — hlavičky již odeslané omylem?

Podívejme se na příklad této chyby, abychom lépe porozuměli příčinám. Chyba se obvykle zobrazuje v tomto tvaru:

Upozornění: Nelze upravit informace záhlaví - záhlaví již odeslaná (výstup začal na /public_html/wp-content/plugins/my-plugin/my-function.php:#) v /public_html/wp-includes/pluggable.php na řádku #

Jak vidíte, chyba zmiňuje dva soubory. První soubor (v našem případě: moje-funkce.php Publikováno v /public_html//wp-content/plugins/my-plugin/) v čele podezřelých. Toto je náš vlastní kód, který je navržen tak, aby upravil základní funkce poskytované WordPress. Základní funkce je v souboru pluggable.php(Soubor jádra WordPress, nezměněný pro jakoukoli instalaci WordPress). Jinými slovy, problém je v prvním souboru, který brání správnému provedení druhého souboru.

Hlavní příčina chyby je zbytečná mezery v prvním souboru. Jsou to mezery v horní nebo dolní části souboru, zbytečné mezery kdekoli v souboru nebo dokonce mezery v značkách PHP . Mimochodem, protože programátoři mohou (a obvykle to dělají) omylem vložit do svého kódu mezery navíc, dochází k této chybě častěji, než byste čekali. Řádek # v chybové zprávě odkazuje na umístění problému – pomůže to vyřešit problém rychleji a bez starostí.

Oprava chyby nemůže změnit informace záhlaví – záhlaví již odeslal

Nyní, když víte, co chybu způsobuje, můžete přejít k její opravě. Ukážeme vám dvě možnosti, jak problém vyřešit, které můžete vyzkoušet jednotlivě nebo postupně, pokud jednotlivě nepomohou.

Možnost 1 – Úprava chybného souboru

První řešení chyby Upozornění: nelze upravit informace v záhlaví– ruční oprava souboru s chybou. V samotné chybové zprávě již máte potřebné informace k nalezení problému (nezapomeňte, že se jedná o první soubor ve zprávě). Vše, co musíte udělat, je otevřít tento soubor přes FTP pomocí klienta, jako je FileZilla, nebo prostřednictvím správce souborů.

V podstatě vše, o co se zde musí postarat, je odstranění nadbytečných mezer/prázdných řádků ze souboru. Dobré místo na začátku bude řádek # uvedený v chybové zprávě. Odtud můžete pokračovat v analýze zbytku souboru a hledání dalších nepotřebných mezer nebo prázdných řádků až na konec dokumentu.

Ujistěte se, že jste správně napsali počáteční a koncové značky PHP. Před ani za značkou by neměla být mezera , stejně jako tag ?> . Poslední řádek kódu by také neměl končit mezerou nebo posunem řádku navíc.

Na snímku obrazovky níže můžete vidět soubor wp-config.php, který má před prvním tagem PHP mezery.


VODÍTKO: Mnoho textových editorů dokáže automaticky odstranit zbytečné mezery. Chcete-li například odstranit přebytečné mezery v editoru Atom, zvýrazněte celý kód a přejděte na P ackages -> Whitespace -> Remove Trailing Whitespace.

Možnost 2 – Nahraďte vadný soubor

Editace celé řady souborů s chybami může být samozřejmě obtížná. Soubory mohou souviset s pluginem nebo motivem, který jste právě nainstalovali na svůj web, nebo mohou být dokonce základními soubory WordPress.

Pokud je chyba skutečně způsobena pluginem nebo motivem, vše, co musíte udělat, je přeinstalovat jej. Tato akce ve většině případů pomáhá. Na druhou stranu, pokud je příčinou chyby základní soubor WordPress, nejlepší řešení vezměte čistou kopii WordPressu a nahraďte soubor s chybou ve vaší instalaci stejným souborem ve správné verzi. Tím zajistíte obnovení chybného souboru výchozí stav, zatímco zbytek instalace vašeho webu WordPress zůstane nedotčen. Nyní stačí znovu načíst stránku a zkontrolovat, zda je chyba opravena.

Na závěr

Ať už jste vložili kus kódu do souboru, přidali nový plugin/téma nebo napsali kód ručně, existuje riziko, že se v souboru objeví další mezery. Tyto zdánlivě nevinné prostory se mohou změnit v chybu WordPress Upozornění: nelze změnit informace v hlavičce — hlavičky již odeslal.

V této příručce jsme se podívali na to, jak takové chyby opravit, a váš web nyní opět funguje podle očekávání. Další výukové programy WordPress naleznete zde.

Autor

Elena má odborné technické vzdělání v oboru informační technologie a zkušenosti s programováním různé jazyky pro různé platformy a systémy. Webovému průmyslu se věnuje více než 10 let, pracuje s různými CMS, jako je Drupal, Joomla, Magento a samozřejmě nejpopulárnějším redakčním systémem současnosti - WordPress. Její články jsou vždy technicky ověřené a přesné, ať už se jedná o recenze pro WordPress nebo pokyny pro nastavení vašeho VPS serveru.