Rješavanje problema "Ne mogu dodati informacije zaglavlja - zaglavlja su već poslana". Što su Http zaglavlja?

Nevjerojatno je kako mala pogreška može vašu WordPress stranicu potpuno onemogućiti. Govorimo, naravno, o poznatoj pogrešci upozorenja WordPress-a Upozorenje: nije moguće promijeniti informacije zaglavlja — zaglavlja je već poslala pluggable.php (ne može promijeniti informacije zaglavlja). Ako ste jedan od onih koji se suočavaju s ovom greškom, onda ste došli na pravo mjesto. U ovom ćemo raspravljati o razlogu zašto se ova pogreška uopće pojavljuje i pogledati rješenja koja će trajno riješiti problem.

Ono što vam treba

Prije nego počnete, provjerite imate li sljedeće:

  • Pristup kontrolnoj ploči vašeg hostinga ili FTP pristup

Kako se javlja Ne mogu promijeniti informacije zaglavlja — zaglavlja koja su već poslana greškom?

Pogledajmo primjer ove pogreške kako bismo bolje razumjeli razloge. Greška se obično pojavljuje u ovom obliku:

Upozorenje: Nije moguće promijeniti informacije zaglavlja - zaglavlja je već poslala (izlaz je započeo na /public_html/wp-content/plugins/my-plugin/my-function.php:#) u /public_html/wp-includes/pluggable.php na liniji #

Kao što vidite, greška spominje dvije datoteke. Prva datoteka (u našem slučaju: moja-funkcija.php objavljeno u /public_html//wp-content/plugins/my-plugin/) na čelu osumnjičenih. Ovo je naš prilagođeni kod koji je dizajniran za izmjenu temeljne funkcije koju pruža WordPress. Osnovna funkcionalnost je u datoteci pluggable.php(WordPress temeljna datoteka, nepromijenjena za bilo koju WordPress instalaciju). Drugim riječima, problem je u prvoj datoteci, što onemogućuje ispravno izvršavanje druge datoteke.

Glavni uzrok pogreške je nepotreban mjesta u prvoj datoteci. To su razmaci na vrhu ili dnu datoteke, nepotrebni razmaci bilo gdje u datoteci ili čak razmaci u PHP oznakama . Usput, budući da programeri mogu (i obično to i čine) pogrešno umetnuti dodatne razmake u svoj kod, ova se pogreška pojavljuje češće nego što biste očekivali. Redak # koji se nalazi u poruci pogreške odnosi se na mjesto problema - to će pomoći da se problem riješi brže i bez problema.

Ispravljanje pogreške ne može promijeniti informacije zaglavlja - zaglavlja je već poslala

Sada kada znate što uzrokuje pogrešku, možete prijeći na njezino popravljanje. Pokazat ćemo vam dvije opcije za rješavanje problema, koje možete pokušati zasebno ili naizmjenično ako pojedinačno ne pomogne.

Opcija 1 – Uređivanje neispravne datoteke

Prvo rješenje za grešku Upozorenje: nije moguće mijenjati informacije zaglavlja– ručno ispravljanje datoteke s greškom. Već imate potrebne informacije za pronalaženje problema u samoj poruci pogreške (zapamtite, ovo je prva datoteka u poruci). Sve što trebate učiniti je otvoriti ovu datoteku putem FTP-a pomoću klijenta kao što je FileZilla ili putem upravitelja datotekama.

U biti, sve o čemu se ovdje treba pobrinuti je uklanjanje dodatnih razmaka/praznih redaka iz datoteke. Lijepo mjesto za početak bit će linija # spomenuta u poruci pogreške. Odavde možete nastaviti analizirati ostatak datoteke, tražeći druge nepotrebne razmake ili prazne retke, sve do kraja dokumenta.

Provjerite jeste li ispravno napisali početak i kraj riječi. PHP oznake. Prije ili iza oznake ne smije biti razmaka , kao i oznaka ?> . Također, posljednji redak koda ne bi trebao završavati razmakom ili dodatnim pomicanjem retka.

Na slici ispod možete vidjeti datoteku wp-config.php, koji ima razmake prije prve PHP oznake.


TRAŽ: U mnogim uređivači teksta Možete automatski ukloniti nepotrebne razmake. Na primjer, da biste uklonili dodatne razmake u uređivaču Atom, označite sav kod i idite na P ackages -> Whitespace -> Remove Trailing Whitespace.

Opcija 2 – Zamijenite neispravnu datoteku

Naravno, uređivanje cijelog niza datoteka s pogreškama može biti teško. Datoteke mogu biti povezane s dodatkom ili temom koju ste upravo instalirali na svoju stranicu ili čak mogu biti datoteke jezgre WordPressa.

Ako je pogrešku doista uzrokovao dodatak ili tema, sve što trebate učiniti je ponovno instalirati. Ova radnja pomaže u većini slučajeva. S druge strane, ako je WordPress jezgrena datoteka uzrok pogreške, najbolje rješenje je uzeti čistu kopiju WordPressa i zamijeniti datoteku s pogreškom u vašoj instalaciji istom onom u ispravnoj verziji. Ovo će osigurati vraćanje neispravne datoteke početno stanje, dok ostatak vaše instalacije WordPress stranice ostaje netaknut. Sada samo ponovno učitajte stranicu i provjerite je li pogreška ispravljena.

U zaključku

Bilo da ste zalijepili dio koda u datoteku, dodali novi dodatak/temu ili ručno napisali kod, postoji rizik od pojave dodatnih razmaka u datoteci. Ovi naizgled nevini prostori mogu se pretvoriti u WordPress grešku Upozorenje: nije moguće promijeniti informacije zaglavlja — zaglavlja je već poslala.

U ovom smo vodiču pogledali kako ispraviti takve pogreške i sada vaša stranica ponovno radi prema očekivanjima. Više vodiča za WordPress možete pronaći ovdje.

Autor

Elena ima stručno tehničko obrazovanje u tom području informacijske tehnologije i iskustvo u programiranju različitim jezicima za različite platforme i sustave. Više od 10 godina posvetila je web industriji, radeći s raznim CMS-ovima, kao što su Drupal, Joomla, Magento i, naravno, najpopularnijim sustavom za upravljanje sadržajem ovih dana - WordPressom. Njezini su članci uvijek tehnički provjereni i točni, bilo da se radi o recenziji za WordPress ili uputama za postavljanje vašeg VPS poslužitelja.

U ovom ćemo članku pogledati za što su zaglavlja potrebna, ne ulazeći u detalje o tome koja je za što odgovorna. Uloge najčešćih naslova bit će opisane u sljedećim člancima.

Svi članci iz serije:

  • Što su Http zaglavlja? Opća teorija.

HTTP je kratica za HyperText Transfer Protocol. Protokol je skup pravila po kojima različite uređaje razmjena podataka. Nastala je devedesetih godina prošlog stoljeća. Sada se koristi gotovo posvuda na Internetu. Sve što vidite u prozoru preglednika dobiveno je putem ovog protokola. http zaglavlja su možda glavna stvar u komunikaciji između uređaja. Oni prenose osnovne informacije o vezi koja se uspostavlja i informacijama koje se prenose ovom vezom.
Pogledajmo dijagram komunikacije između dva uređaja. Neka ovi uređaji budu vaše računalo i neki server na internetu:

Kao što vidite, preglednik je poslao http zahtjev. To bi moglo izgledati otprilike ovako:

GET /other-19 HTTP/1.1
Domaćin: www.scriptsite.ru
Korisnički 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)
Prihvati: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: 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
Održi na životu: 300
Veza: Keep-alive

U ovom slučaju, prvi redak je redak zahtjeva, svi ostali redovi su http zaglavlja koja nose dodatne informacije o zahtjevu, o klijentu koji traži te informacije i o mnogim drugim stvarima.
Kao odgovor na naš zahtjev, poslužitelj može poslati sljedeća zaglavlja:

Poslužitelj: 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 (24. rujna 2007.)

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=ft47gokfee6amv3eda3k1p93s3; put=/

Kontrola predmemorije: bez pohrane, bez predmemorije, mora se ponovo potvrditi, naknadna provjera=0, prethodna provjera=0

Pragma: bez predmemorije

Keep-Alive: vrijeme čekanja=10, max=1024

Veza: Keep-Alive

Transfer-Encoding: chunked

Vrsta sadržaja: tekst/html

Prva linija je statusna linija. Preostali redovi su zaglavlja. Dijagram je pokazao da se učitava i sadržaj stranice. Ali ovaj se sadržaj obično ne prikazuje u dodacima za pregled zaglavlja. A sadržaj stranice samo je poseban slučaj. Prema protokolu, stranica ne mora nužno biti poslana. Umjesto toga, i slika i zvučna datoteka, i video. I svi će oni imati vrlo različite naslove.

Kako vidjeti http zaglavlja?

Kako biste vidjeli http zaglavlja, preporučujem sljedeće dodatke za preglednik firefox:

Ako koristite Chrome preglednik, sve informacije možete pogledati klikom na gumb postavki - alati - alati za razvojne programere. Kartica Mreže.
Za korisnike preglednik opera Ne mogu vam dati nikakav savjet jer nisam upoznat s ovim preglednikom. Nakon što su dodaci instalirani i pokrenuti, pokušajte osvježiti stranicu. Odmah ćete vidjeti ogromne liste zahtjeva i odgovora putem kojih je vaš preglednik komunicirao s poslužiteljem.

Http zaglavlja i pristup njima u php-u

Ako ste PHP programer, možete pristupiti zaglavljima zahtjeva pomoću funkcije getallheaders(). Da bismo razumjeli kako to radi, pokrenimo sljedeći kod:

I dobivamo ispis niza zaglavlja.

Ali češće im se pristupa preko globalne varijable $_SERVER. Gotovo svako http zaglavlje ima sličan naziv elementa u ovoj varijabli, formiran prema principu HTTP_header_name. Dakle, za isti 'User_Agent' postoji varijabla $_SERVER['HTTP_USER_AGENT'];

Da biste dobili zaglavlja koja će poslužitelj poslati korisniku, koristi se funkcija headers_list(). U pravilu, poslužitelj sastavlja potrebna zaglavlja koja nedostaju na kraju svih skripti. Stoga će ovaj niz sadržavati zaglavlja ili ona koja je poslužitelj stvorio prije nego što je skripta počela izvršavati (i ona se neće mijenjati), ili ona koja smo postavili ručno. Mogu se postaviti ručno pomoću funkcije zaglavlje ("tekst zaglavlja");
Pokrenimo sljedeći kod:

Vidjet ćemo ispis zaglavlja spreman za slanje u trenutku poziva funkcije:

Prvo zaglavlje postavljeno je automatski i nosi naziv poslužitelja na kojem se skripta izvodi. Drugi smo instalirali ručno. Ako je pregledniku potrebno zaglavlje "Voće", uzeo bi ga iz http odgovora poslužitelja i koristio ga. Ali budući da ga naš preglednik ne treba, jednostavno ignorira redak koji ne razumije.

Struktura HTTP zahtjeva

Naš zahtjev izgleda ovako:

Prvi redak u njemu, kao što je ranije spomenuto, je redak upita. Sastoji se od tri dijela:

  • metoda(metoda) - označava koju vrstu zahtjeva. Najčešće metode: GET, POST, HEAD. O njima će biti pisano u sljedećem odlomku.
  • put(staza) - obično je to dio URL-a koji dolazi nakon domene. Na primjer, ako uđete adresna traka http://www.scriptsite.ru/about/, vrijednost staze bit će /about/.
  • protokol(protokol) — korišteni protokol. Obično se sastoji od "HTTP" i verzije protokola. Obično, u moderni preglednici koristi se verzija 1.1

Zatim slijede zaglavlja u obliku nizova formata "Ime: vrijednost".
Usput, podaci o kolačićima također se prenose u ovom zahtjevu kao jedno od zaglavlja. Većina ovih redaka nije obavezna. Upit se može svesti na samo dva retka:

GET /article/show/4/ HTTP/1.1

Domaćin: scriptsite.ru

Metode zahtjeva

DOBITI

Zahtjev za dobivanje obično se koristi za traženje dokumenta i prosljeđivanje nekih parametara.
Ovo je glavna metoda koja se koristi za dobivanje html stranica, slika, css i JavaScript datoteke itd.
Zbog činjenice da parametri mogu biti bilo što, a poslužitelj nema ograničenja u načinu njihove obrade, često se za prijenos informacija koristi metoda zahtjeva za podacima. Na primjer, imat ćemo ovakav obrazac

U tom će slučaju ti parametri biti vidljivi u adresnoj traci preglednika.

POST

Post je metoda koja se koristi za slanje podataka na poslužitelj. Iako možete poslati podatke poslužitelju pomoću metode GET putem adresne trake preglednika, u većini slučajeva poželjno je koristiti POST. Slanje velike količine podataka putem GET-a je nepraktično. Osim toga, GET ima neka ograničenja koja ne dopuštaju, na primjer, objavljivanje ovog članka na mojoj web stranici putem samo jedne linije preglednika. POST zahtjevi se najčešće koriste za slanje web obrazaca. Modificirajmo obrazac iz prethodnog primjera da mu damo POST metodu

Programeri koji počinju koristiti PHP često se susreću s ovom porukom o pogrešci. Razumijevanje zašto se ova pogreška pojavljuje pomoći će vam pronaći rješenje.

PHP radi velik dio posla generiranja web stranica za vas, a da ga ni ne pitate. Web stranica sastoji se od dva dijela: zaglavlja i tijela.

Ova uobičajena PHP pogreška uočava se kada programer pogriješi u manipuliranju ili stvaranju zaglavlja. Evo primjera:

Upozorenje: Nije moguće promijeniti informacije zaglavlja – zaglavlja je već poslala (izlaz je započeo na /home/usr1/public_html/sent.php:42) u /home/usr1/public_html/includes/theme-header.php na liniji 12

Obično ne morate brinuti o zaglavlju jer se automatski generira i sadrži informacije o stranici, poslužitelju i kolačiću. Podaci u zaglavlju su važni, ali obično nisu vidljivi korisniku. Evo nekoliko primjera:

Datum: 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

Ponekad programeri žele promijeniti neke vrijednosti zaglavlja. Na primjer, ako PHP generira XML izlaz, Content-Type mora biti promijenjen kako bi to označio. Još jedan čest primjer je preusmjeravanje korisničkog preglednika na drugu web stranicu pomoću elementa zaglavlja Location, kao što je opisano u ovom članku.

Zaglavlje mora biti prvo u odgovoru s web poslužitelja i odvojeno je od tijela jednim praznim redom. Razlog za ovu pogrešku je taj što je neki dio tijela web stranice već poslan korisniku prije pokušaja postavljanja vrijednosti zaglavlja. Budući da PHP pojednostavljuje mnoge stvari za vas, problem može vrebati na uobičajenom mjestu. Evo nekoliko smjernica za pronalaženje problema:

  1. Pronađite naredbu header() koja uzrokuje problem. Greška mora biti na ili prije ovog retka.
  2. Potražite sve upute koje bi mogle usmjeriti izlaz korisniku prije ove izjave zaglavlja. Ako pronađete jedan ili više njih, promijenite kod da biste premjestili uputu zaglavlja ispred njih. Složeni uvjetni iskazi mogu zakomplicirati problem, ali također mogu pomoći u rješavanju problema. Alternativno, možete koristiti uvjetni izraz na vrhu PHP skripte, koja određuje vrijednost zaglavlja što je ranije moguće i tamo je postavlja.
  3. Pazite da nema razmaka izvan PHP početne i završne oznake. Dok prazan redak prije početne oznake
  4. Ako svoju datoteku spremate u UTF-8 kodiranju, provjerite je li datoteka spremljena bez potpisa (bez BOM-a). Potpis je bajt dodan na početku datoteke, a ako je PHP skripta spremljena u ovom formatu, tada će se ovaj bajt percipirati kao dio izlaza tijela stranice, što se ne bi smjelo dopustiti kako bismo izbjegli problem koji razmatraju.

Ljudi mi stalno dolaze s ovom pogreškom i pitaju: " Gdje je greška?". U cijelom vremenskom razdoblju primio sam otprilike nekoliko ovakvih pisama 500 , ništa manje. Vrijeme je da završimo s pogreškom "". U ovom ću članku govoriti o razlozima ove pogreške, kao io tome kako je riješiti.

Ako ovu pogrešku prevedete na ruski, dobit ćete nešto poput ovoga: " Ne mogu promijeniti zaglavlje jer su već poslani"Što je ovo" zaglavlja"? Hajde da to shvatimo.

Kada poslužitelj vrati odgovor klijentu koji nije tijelo (na primjer, HTML kôd stranice), tu su i naslovi. Sadrže kod odgovora poslužitelja, kolačić, kodiranje i mnogi drugi parametri usluge. Može PHP skripta poslati naslov? Naravno da može. Za to postoji funkcija zaglavlje().

Ova se funkcija, na primjer, stalno koristi kada. Ova se funkcija također redovito koristi za .

Također, zaglavlja se mijenjaju nakon slanja kolačić i na početku sesije (funkcija session_start()).

A sada zašto se greška i dalje javlja? Poslužitelj uvijek prvo poslužitelju daje zaglavlja, a zatim tijelo. Ako je poslužitelj već vratio zaglavlja, tijelo odlazi, a zatim nailazi na neke session_start(). Ispostavilo se da je nesretni programer zaboravio poslati zaglavlja prije početka tijela i sada želi sustići vlak koji je već otišao.

Evo koda s pogreškom "":



?>

Naravno, takve gluposti PHP ne oprašta. A trebalo je pisati ovako:

početak_sesije(); // Započnimo sesiju
?>

Ova skripta neće uzrokovati nikakve pogreške jer se prvo šalju sva zaglavlja, a tek onda se generira tijelo odgovora poslužitelja.

Još jedan primjer koda s pogreškom:

echo "Zdravo!"; // Ispis nečega
početak_sesije(); // Započnimo sesiju
?>

Ista stvar, iz nekog razloga prvo se prikaže tijelo (ili dio njega), a onda su se sjetili da trebaju modificirati i zaglavlja.

Koji je ispravan način prepisivanja ovaj kod, razmislite sami.

Još jedan primjer:




Izlaz;
?>

Kada autor takvog koda ne uspije, iznenadi se ovom greškom i kaže: “Vrlo čudna koincidencija, kada je operacija uspješna, sve je u redu, a kada postoji neka greška, kažu mi Cannot modify header information - headers već poslano.” Ne doslovno, ali to je bit.

Problem je isti, a ispravan način pisanja je:

$greška = istina; // Je li bilo grešaka?
if ($error) echo "Došlo je do greške";
else header("Lokacija: ".$_SERVER["HTTP_REFERER"]); // Preusmjeri natrag
Izlaz;
?>

Postoje i suptilne greške:

zaglavlje("Lokacija: ".$_SERVER["HTTP_REFERER"]); // Preusmjeri natrag
Izlaz;
?>

Pogreška u ovom kodu javlja se zbog razmaka, koji je prisutan prije . Prostor je normalan lik i dio je odgovornog tijela. A kada poslužitelj to vidi, zaključuje da više neće biti zaglavlja i da je vrijeme za izlaz tijela.

Postoje i sljedeće pogreške, koje su iste prirode. Recimo da postoji datoteka a.html:

require_once "a.html";
zaglavlje("Lokacija: ".$_SERVER["HTTP_REFERER"]); // Preusmjeri natrag
Izlaz;
?>

I osoba je iskreno iznenađena, odakle je došla pogreška ako nije ništa ispisao? Stoga ne morate posebno tražiti 1 datoteku i sve datoteke koje su u njoj uključene. A u onima koji su povezani s onima koji su povezani, također morate pogledati tako da nema izlaza.

I posljednja točka, ali teža. Ispostavilo se da se ponekad ova greška javlja kada ispravan kod. Onda je to to to je stvar kodiranja. Provjerite je li kodiranje datoteke " UTF-8 bez BOM-a"i točno" bez sastavnice"i ne samo" UTF-8". Jer BOM su bajtovi koji dolaze na samom početku datoteke i oni su izlaz.

Stvarno se nadam da će ovaj članak pomoći u rješavanju apsolutno svih problema povezanih s pogreškom "", jer sam pokušao istaknuti sve probleme koji se pojavljuju. A onda trebate okrenuti glavu i razmisliti, što nije u redu u vašem kodu?

Ovu grešku je lako popraviti.
Često se ista poruka pojavljuje na početku sesije, u malo drugačijem tekstu:
Upozorenje: Nije moguće poslati kolačić sesije - zaglavlja su već poslana
Upozorenje: Nije moguće poslati limiter predmemorije sesije - zaglavlja su već poslana

Oznaka reda bajtova
Ponekad ste provjerili SVE i nema ništa. Promjena urednika. Pogledajte svoju datoteku u drugom programu. Na primjer, Windows Notepad, kada koristi Unicode kodiranje, dodaje servisni simbol Byte Order Mark na početak vaše datoteke, bez da vas o tome obavijesti na bilo koji način. Otvorite skriptu u drugom uređivaču i uklonite sve suvišne znakove. I promijenite Notepad u drugi editor.
Ili spremite u UTF-8 kodiranje bez BOM-a

Brojna pitanja na forumu me tjeraju da radim ovdje važna napomena:
Ova se pogreška ne pojavljuje jer je "nešto napisano gore" u vašoj skripti. I iz činjenice da PHP prikazuje nešto u pregledniku. Ovo nije nužno kod. Moglo bi biti poruka o grešci. može biti razmak ili HTML oznaka. Da, da. Za najtalentiranije: govorimo o bilo kojem znaku koji se šalje pregledniku, a ne samo o onima koje preglednik prikazuje neiskusnom korisniku. U HTML stranice postoji izvorni tekst. I upravo je to rezultat rada PHP skripta, a ne lijepa slova sa slikama, kako misli jako veliki broj ljudi.


2024, applelavka.ru - Proučavanje računala. Samo nešto komplicirano. Naprave