Řešení problému "Nelze přidat informace záhlaví - záhlaví již odeslána". Co jsou hlavičky HTTP?

Je úžasné, jak malá chyba může způsobit, že váš web WordPress bude zcela nefunkční. Hovoříme samozřejmě o slavné 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 v 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 objeví 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 připojitelný.php(Základní soubor 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 # uvedený 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 začátek a konec slova. PHP tagy. 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: V mnoha textové editory Nepotřebná místa můžete odstranit automaticky. 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ším řešením je vzít čistou kopii WordPressu a nahradit 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.

V tomto článku se podíváme na to, k čemu jsou záhlaví potřebná, aniž bychom zacházeli do podrobností o tom, který z nich 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 soubor pravidel, podle kterých různá zařízení vyměňovat 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 pro prohlížení záhlaví. A obsah stránky je pouze speciální případ. Podle protokolu nemusí být stránka nutně přenášena. Místo toho, jak obrázek, tak 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žijete Prohlížeč Chrome, všechny informace zobrazíte kliknutím na tlačítko nastavení - nástroje - nástroje pro vývojáře. Karta Sítě.
Pro uživatele prohlížeč opera Nemohu poradit, protože tento prohlížeč neznám. 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(). Chybějící požadované hlavičky na konci všech skriptů zpravidla sestavuje server. 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é nastavíme 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 zadáte adresní řádek 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/show/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 soubory JavaScript, atd.
Vzhledem k tomu, že parametry mohou být jakékoli a server nemá žádná omezení, jak je lze zpracovat, je k přenosu informací často používána metoda data request. Budeme mít například takovýto formulář

V tomto případě budou tyto parametry viditelné v adresním řádku prohlížeč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

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.

Tato běžná chyba PHP je pozorována, když programátor udělá chyby při manipulaci nebo vytváření hlaviček. 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 pro uživatele obvykle nejsou 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, je nutné změnit Content-Type, aby to bylo uvedeno. 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 v horní části skriptu PHP, 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í.

Lidé za mnou neustále přicházejí s touto chybou a ptají se: " kde je chyba? Za celou dobu jsem dostal asi několik takových dopisů 500 , ne méně. Je čas skončit s chybou "". V tomto článku budu hovořit o důvodech této chyby a také o tom, jak ji vyřešit.

Pokud tuto chybu přeložíte do ruštiny, dostanete něco takového: " Záhlaví nelze změnit, protože již byly odeslány"Co je to" hlavičky"? Pojďme na to."

Když server vrátí klientovi odpověď jinou než tělo (např. HTML kód stránky), jsou zde také nadpisy. Obsahují kód odpovědi serveru, cookie, kódování a mnoho dalších parametrů služby. Umět PHP skript poslat titulek? Samozřejmě, že může. Existuje na to funkce záhlaví().

Tato funkce se například neustále používá, když. Tato funkce se také pravidelně používá pro .

Při odeslání se také upravují záhlaví cookie a na začátku relace (funkce session_start()).

A teď o tom, proč se chyba stále vyskytuje? Server vždy nejprve serveru předá záhlaví a poté tělo. Pokud server již vrátil hlavičky, tělo odejde a pak na nějaké narazí session_start(). Ukáže se, že nešťastný programátor zapomněl odeslat hlavičky před startem těla a nyní chce dohnat vlak, který už odjel.

Zde je kód s chybou "":



?>

Samozřejmě takový nesmysl PHP neodpouští. A mělo to být napsáno takto:

session_start(); // Začněme relaci
?>

Tento skript již nebude způsobovat žádné chyby, protože jsou nejprve odeslány všechny hlavičky a teprve poté je vygenerováno tělo odpovědi serveru.

Další příklad kódu s chybou:

echo "Ahoj!"; // Něco vytisknout
session_start(); // Začněme relaci
?>

To samé, z nějakého důvodu se nejprve zobrazí tělo (nebo jeho část) a pak si vzpomněli, že je třeba upravit i záhlaví.

Jaký je správný způsob přepisování tento kód, zamyslete se nad sebou.

Další příklad:




výstup;
?>

Když autor takového kódu selže, je touto chybou překvapen a říká: „Je to velmi zvláštní náhoda, když je operace úspěšná, je vše v pořádku a když je nějaká chyba, řeknou mi Nelze upravit informace v hlavičce - hlavičky už posláno." Ne doslova, ale o to jde.

Problém je stejný a správný způsob, jak to napsat, je:

$chyba = pravda; // Vyskytly se nějaké chyby?
if ($error) echo "Došlo k chybě";
else header("Umístění: ".$_SERVER["HTTP_REFERER"]); // Přesměrování zpět
výstup;
?>

Jsou tam i drobné chyby:

header("Umístění: ".$_SERVER["HTTP_REFERER"]); // Přesměrování zpět
výstup;
?>

Chyba v tomto kódu je způsobena mezerou, který je přítomen dříve . Prostor je normální charakter a je součástí těla odpovědi. A když to server uvidí, dojde k závěru, že již nebudou žádné hlavičky a je čas vydat tělo.

Existují také následující chyby, které jsou stejné povahy. Řekněme, že existuje soubor a.html:

vyžadovat_jednou "a.html";
header("Umístění: ".$_SERVER["HTTP_REFERER"]); // Přesměrování zpět
výstup;
?>

A člověk je upřímně překvapen, kde se vzala chyba, když nic nevypsal? Proto nemusíte hledat konkrétně 1 a všechny soubory, které jsou v něm obsaženy. A v těch, které jsou připojeny k těm, které se připojují, je třeba se také podívat, aby tam nebyl žádný výstup.

A poslední bod, ale složitější. Ukazuje se, že někdy tato chyba nastane, když správný kód. Pak všechny je to otázka kódování. Ujistěte se, že kódování souboru je " UTF-8 bez kusovníku"a přesně" bez kusovníku"a nejen" UTF-8". Protože kusovník jsou bajty, které přicházejí na samém začátku souboru a jsou výstupem.

Opravdu doufám, že tento článek pomůže vyřešit absolutně všechny problémy spojené s chybou „“, protože jsem se snažil upozornit na všechny problémy, které nastanou. A pak musíte otočit hlavu a přemýšlet, co je ve vašem kódu špatně?

Tuto chybu lze snadno opravit.
Často se na začátku relací objeví stejná zpráva v mírně odlišném znění:
Upozornění: Nelze odeslat cookie relace – záhlaví již byla odeslána
Upozornění: Nelze odeslat omezovač mezipaměti relace – záhlaví již byla odeslána

Značka pořadí bajtů
Někdy jste zkontrolovali VŠECHNO a nic tam není. Změnit editor. Zobrazte soubor v jiném programu. Například program Poznámkový blok systému Windows při použití kódování Unicode přidá na začátek souboru servisní znak Byte Order Mark, aniž by vás o tom jakkoli informoval. Otevřete skript v jiném editoru a odstraňte všechny nadbytečné znaky. A změňte Poznámkový blok na jiný editor.
Nebo uložit v kódování UTF-8 bez kusovníku

Četné otázky na fóru mě nutí udělat zde důležitá poznámka:
Tato chyba se neobjeví, protože ve vašem skriptu je „něco napsáno výše“. A z toho, že PHP něco zobrazuje v prohlížeči. Toto není nutně kód. To může být chybové hlášení. může být mezera nebo HTML tag. Ano ano. Pro nejtalentovanější: mluvíme o jakékoli postavě odeslané do prohlížeče, a nejen o těch, které prohlížeč zobrazí nezkušenému uživateli. U HTML stránky je tam zdrojový text. A to je přesně výsledek práce PHP skript, a ne krásné dopisy s obrázky, jak si velmi velký počet lidí myslí.


2024, applelavka.ru - Studium počítače. Prostě něco složitého. Gadgety