Anteturi de informații urâte. Ce sunt anteturile HTTP?

Anteturi de informații urâte. Ce sunt anteturile HTTP?

În acest articol ne vom uita la principalele cauze și soluții pentru eroarea „Este imposibil să schimbați anteturile deoarece acestea au fost deja trimise” ("Nu se poate modifica informații din antet- anteturi deja trimise de").

Ce înseamnă această eroare?

Pentru a înțelege motivele erorii, trebuie mai întâi să înțelegeți care sunt aceste „anteturi”.

Să nu intrăm adânc în teorie. Să spunem că înainte ca orice utilizator să deschidă o pagină web, aceleași „anteturi” îi sunt trimise, care conțin codificarea, limba site-ului, datele serverului și alte informații de serviciu. De asemenea, merită adăugat separat că cookie-urile și sesiunea sunt trimise și în anteturi.

Ce comenzi cauzează această eroare?

Eroare „Nu se pot modifica informațiile antetului - anteturile deja trimise de” poate apela comenzi PHP precum header , setcookie și altele legate de funcționarea cookie-urilor sau a sesiunilor.

Motive și soluții pentru eroare.

Cel mai mult greseala comuna se întâmplă din lipsă de experiență. Ne-am dat seama deja că anteturile sunt trimise înainte ca pagina în sine să înceapă să se încarce.

Dar programatorii, în special începătorii, pur și simplu uită sau nici măcar nu știu asta. Și mai întâi încearcă să afișeze ceva pe pagină - cel mai adesea folosind comanda echo, apoi setează cookie-uri, trimit anteturi etc. Ceea ce duce exact la această eroare.

Iată un exemplu de cod care ar duce la această eroare:

Iată opțiunea corectă:

Adică, în primul rând, nu poți afișa nimic înainte de a trimite anteturile!

Nu este întotdeauna evident, dar există o eroare cu o ușoară diferență. Acesta este momentul în care documentul dvs. PHP începe cu spații sau linii goale, ceea ce înseamnă că aceste linii sunt afișate în browser.

Acest lucru poate fi foarte dificil de monitorizat, deoarece, de exemplu, blocnotesul Windows poate adăuga un marcaj de ordine de octeți la început, fără să ne avertizeze în vreun fel sau chiar să arate acest simbol. În acest caz, ar trebui să deschideți documentul folosind alți editori și să verificați.

Iată un exemplu de setare incorect a antetelor:

Adică, în al doilea rând, înainte

Ar trebui să fiți deosebit de atenți dacă utilizați comanda include, în esență, combină toate fișierele și face unul rezultat, și dacă ați inclus mai întâi antetul site-ului (glider, meniu etc.) și apoi încercați să trimiteți anteturi în fișierul principal , atunci desigur că veți primi această eroare.

Iată un exemplu de astfel de cod incorect:

Depus de pe Joi, 05.04.2017 - 12:55

Descrierea unei anumite probleme

După ce faceți clic pe butonul, apare o eroare:

Avertisment: Nu se pot modifica informațiile antetului - anteturile deja trimise de (ieșire a început la C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10) în C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php pe linia 12

Codul este similar cu cel din acest subiect:

Web experimental

Selectați scriptul de descărcat



Script de gestionare:



Când se întâmplă asta

Tip de eroare (avertisment):

Avertisment: Nu se pot modifica informațiile antetului - anteturile deja trimise de

Apare dacă ați făcut deja ceva care necesită setarea antetelor browserului și acum doriți să le rescrieți cu altele noi. De exemplu, dacă ați afișat deja text, atunci php setează anteturile (în special antetul Locaţie-- care arată dacă trebuie să rămâneți pe pagina solicitată sau dacă trebuie să mergeți pe o altă pagină și să obțineți un răspuns la cerere acolo) pentru a arăta browserului clientului (în răspunsul său) cum să se comporte.

Rădăcina problemei

Cel mai probabil, problema în cazul dvs. este că deja difuzați conținut (etichete html care sunt amestecate în fișier cu scriptul) la comenzi:

Antet Echo($redirect);

Amintiți-vă că funcția header() poate fi apelată numai dacă clientul încă nu au fost transferate date. Adică, ar trebui să fie primul în ieșire, nu ar trebui să existe etichete HTML, linii goale etc. înainte de apel. Destul de des apare o eroare la citirea codului funcțiile fișierului, precum include sau require, acest cod conține spații sau linii goale care sunt tipărite înainte ca header() să fie apelat. Aceleași probleme pot apărea atunci când utilizați un singur fișier PHP/HTML.

Adică, este necesar să scăpați de html handlerul de script - la urma urmei, în esență, nu scoate nimic în sine, ci pur și simplu îl transferă la o altă adresă - acesta este primul.

Antet($redirect);

Antet Echo($redirect);

Experiment

Deoarece echo() scrie în general în Corpul răspunsului http, și nu în anteturi, iar antetul returnează void (adică nu returnează valori), așa cum s-a menționat mai sus, atunci nu are rost să folosiți echo(), dar
- cu toate acestea, îmi propun să efectuăm un experiment:

  1. eliminați html
  2. nu elimina ecoul

Deoarece header() este apelat în esență înainte de echo() (deoarece header() este un argument pentru echo()), ceea ce înseamnă return - în același timp, să verificăm dacă funcția returnează null - va fi interpretată ca șir gol sau (ceea ce este mai corect) echo nici măcar nu va începe să funcționeze până când redirecționarea nu a avut loc deja.

Să lămurim din nou motivul

Aceste. înainte de a apela header() nu trebuie afișat niciun conținut(despre ce este scris în descrierea funcției: http://php.net/manual/ru/function.header...)

  • 1) nici cu ecou
  • 2) nu prin simpla descărcare a textului html în browser.

În cazul nostru, aparent ecou nu afectează nimic, dar html-ul din handler chiar o face.

problema a fost rezolvată

La sfatul dvs. au fost eliminate Etichete HTML. Acum redirecționarea are loc corect, scriptul de gestionare arată astfel:

Funcția ecou nu afectează cu adevărat funcționarea, adică. De asemenea, puteți lăsa ca în S. Holzner:

De asemenea, atunci când scrieți codul pentru o redirecționare, ar trebui să fiți atenți la extensia fișierului la care se face tranziția: cu sintaxa propusă, aceasta trebuie specificată în argumentul antet.

  • Conectați-vă pentru a posta comentarii

Dar o poți face să funcționeze

Dar puteți face și manevrarea anterioară

Redirecționarea utilizatorului

dacă setați opțiunea în fișierul php.ini

Buffer_ieșire = 4096

  • Conectați-vă pentru a posta comentarii

Retrimiterea antetelor este interzisă, protocolul HTTP nu funcționează așa! Dar ce ar trebui să facem? Dacă, după afișarea pe pagină, trebuie să începeți și o sesiune și să setați un cookie? - Să ne amintim despre tamponarea ieșirii.

Adică, atunci când este setată o dimensiune de buffer diferită de zero, atunci până când este plină este încă posibilă manipularea antetelor. Dacă dimensiunea tamponului este zero, după ce conținutul este scos, acesta este returnat imediat precedat de transmiterea antetelor de răspuns HTTP către client.

Și se dovedește că vrem să schimbăm anteturile care au „zburat” deja peste rețea către client (ceea ce înseamnă că nu mai este posibil să le corectăm - în special antetul Locaţie, care indică dacă să rămânem pe pagina solicitată sau să cereți alta - răspunsul scriptului „redirector” (pentru noi acesta este un handler de formular) spune doar că trebuie să solicităm o altă pagină), despre care ne avertizează php .

Dar: Desigur, este imposibil să rezolvi problema în acest fel (nu foarte corect, mai exact).

_____________
Facultatea de Matematică a VSU și alți clasici =)

  • Conectați-vă pentru a posta comentarii

Este uimitor cum o mică greșeală poate face site-ul dvs. WordPress complet inoperabil. Vorbim, desigur, despre celebra eroare de avertizare WordPress Avertisment: nu se pot modifica informațiile antetului - anteturile deja trimise de pluggable.php (nu se pot modifica informațiile antetului). Dacă sunteți unul dintre cei care se confruntă cu această eroare, atunci ați ajuns la locul potrivit. În aceasta, vom discuta motivul pentru care această eroare apare în primul rând și vom analiza soluțiile care vor rezolva problema în mod permanent.

Ce ai nevoie

Înainte de a începe, asigurați-vă că aveți următoarele:

  • Acces la panoul de control al găzduirii sau acces FTP

Cum apar informațiile de antet Nu se pot modifica - anteturile deja trimise prin eroare?

Să ne uităm la un exemplu al acestei erori pentru a înțelege mai bine motivele. Eroarea apare de obicei sub această formă:

Avertisment: Nu se pot modifica informațiile antetului - anteturile deja trimise de (ieșirea a început la /public_html/wp-content/plugins/my-plugin/my-function.php:#) în /public_html/wp-includes/pluggable.php pe linia #

După cum puteți vedea, eroarea menționează două fișiere. Primul fișier (în cazul nostru: my-function.php postat în /public_html//wp-content/plugins/my-plugin/) în fruntea suspecţilor. Acesta este codul nostru personalizat care este conceput pentru a modifica funcționalitatea de bază oferită de WordPress. Funcționalitatea de bază se află în fișier conectabil.php(Fișier de bază WordPress, neschimbat pentru niciunul Instalări WordPress). Cu alte cuvinte, problema este în primul fișier, ceea ce împiedică executarea corectă a celui de-al doilea fișier.

Cauza principală a erorii este inutilă spații în primul fișier. Acestea sunt spații în partea de sus sau de jos a fișierului, spații inutile oriunde în fișier sau chiar spații în etichetele PHP . Apropo, deoarece programatorii pot (și de obicei o fac) să introducă din greșeală spații suplimentare în codul lor, această eroare apare mai des decât v-ați aștepta. Linia # furnizată în mesajul de eroare se referă la locația problemei - acest lucru va ajuta la rezolvarea problemei mai rapid și fără agitație.

Remedierea erorii nu poate modifica informațiile antetului - anteturile deja trimise de

Acum că știți ce cauzează eroarea, puteți continua să o remediați. Vă vom arăta două opțiuni pentru a remedia problema, pe care le puteți încerca separat sau pe rând, dacă individual nu vă ajută.

Opțiunea 1 – Editarea fișierului defect

Prima soluție la eroare Atenție: nu se pot modifica informațiile din antet– corectarea manuală a unui fișier cu o eroare. Il ai deja in stoc informatiile necesare, pentru a găsi problema în mesajul de eroare în sine (rețineți că acesta este primul fișier din mesaj). Tot ce trebuie să faceți este să deschideți acest fișier prin FTP folosind un client precum FileZilla sau printr-un manager de fișiere.

În esență, tot ceea ce trebuie avut în vedere aici este eliminarea spațiilor suplimentare/liniilor goale din fișier. Un loc frumos pentru început va fi linia # menționată în mesajul de eroare. De aici, puteți continua să analizați restul fișierului, căutând alte spații inutile sau linii goale, până la sfârșitul documentului.

Asigurați-vă că scrieți corect etichetele de început și de sfârșit PHP. Nu ar trebui să existe spațiu înainte sau după etichetă , precum și eticheta ?> . Asemenea, ultima linie Codul nu trebuie să se încheie cu un spațiu sau cu o întrerupere suplimentară de linie.

În captura de ecran de mai jos puteți vedea fișierul wp-config.php, care are spații înaintea primei etichete PHP.


CHEIE: În multe editori de text Puteți elimina automat spațiile inutile. De exemplu, pentru a șterge spatii suplimentareîn editorul Atom, evidențiați tot codul și mergeți la P ackages -> Spațiu alb -> Eliminați spațiul alb final.

Opțiunea 2 – Înlocuiți fișierul defect

Desigur, editarea unei serii întregi de fișiere cu erori poate fi dificilă. Fișierele ar putea fi legate de un plugin sau o temă pe care tocmai ați instalat-o pe site-ul dvs. sau ar putea fi chiar fișiere de bază WordPress.

Dacă eroarea este într-adevăr cauzată de un plugin sau o temă, tot ce trebuie să faceți este să o reinstalați. Această acțiune ajută în majoritatea cazurilor. Pe de altă parte, dacă fișierul de bază WordPress este cauza erorii, cea mai bună soluție este să luați o copie curată a WordPress și să înlocuiți fișierul cu eroarea din instalarea dvs. cu același în versiunea corectă. Acest lucru va asigura că fișierul defect este restaurat starea initiala, în timp ce restul instalării site-ului dvs. WordPress rămâne intactă. Acum, reîncărcați pagina și asigurați-vă că eroarea este remediată.

În concluzie

Indiferent dacă ați lipit o bucată de cod într-un fișier, ați adăugat un nou plugin/temă sau ați scris codul manual, există riscul ca în fișier să apară spații suplimentare. Aceste spații aparent inocente se pot transforma într-o eroare WordPress Avertisment: nu se pot modifica informațiile antetului — anteturi deja trimise de.

În acest ghid, am analizat cum să remediați astfel de erori, iar acum site-ul dvs. funcționează din nou conform așteptărilor. Mai multe tutoriale WordPress pot fi găsite aici.

Autor

Elena are un profesionist învăţământul tehnicîn zonă tehnologia de informațieși experiență în programare în diferite limbi pentru diferite platforme și sisteme. Ea a dedicat mai mult de 10 ani industriei web, lucrând cu diverse CMS-uri, cum ar fi Drupal, Joomla, Magento și, desigur, cel mai popular sistem de management al conținutului din zilele noastre – WordPress. Articolele ei sunt întotdeauna verificate din punct de vedere tehnic și exacte, fie că este vorba despre o recenzie pentru WordPress sau instrucțiuni pentru configurarea serverului dvs. VPS.

Acest mesaj de eroare este adesea întâlnit de programatorii care încep să folosească PHP. Înțelegerea de ce apare această eroare vă va ajuta să găsiți o soluție.

PHP face o mare parte din munca de a genera pagini web pentru tine, fara ca tu sa intrebi. O pagină web este formată din două părți: un antet și un corp.

Această eroare PHP comună este observată atunci când programatorul face greșeli în manipularea sau crearea antetelor. Iată un exemplu:

Avertisment: Nu se pot modifica informațiile antetului – anteturile deja trimise de (ieșirea a început la /home/usr1/public_html/sent.php:42) în /home/usr1/public_html/includes/theme-header.php pe linia 12

De obicei, nu trebuie să vă faceți griji cu privire la antet, deoarece este generat automat și conține informații despre pagină, server și cookie. Informațiile din antet sunt importante, dar de obicei nu sunt vizibile pentru utilizator. Iată câteva exemple:

Data: Luni, 10 iulie 2006 18:51:59 GMT Server: Apache/2.2.0 (Unix) mod_ssl/2.2.0 OpenSSL/0.9.7g Codificare conținut: gzip Tip conținut: text/html

Uneori, programatorii doresc să modifice unele valori de antet. De exemplu, dacă PHP generează ieșire XML, Tipul de conținut trebuie modificat pentru a indica acest lucru. Un alt exemplu comun este redirecționarea browserului utilizatorului către o altă pagină web folosind elementul antet Locație, așa cum este descris în acest articol.

Antetul trebuie să apară primul în răspunsul de la serverul web și este separat de corp printr-o linie goală. Motivul acestei erori este că o parte din corpul paginii web a fost deja trimisă utilizatorului înainte de a se încerca setarea valorii antetului. Deoarece PHP simplifică multe lucruri pentru dvs., problema poate fi pândită în locul obișnuit. Iată câteva îndrumări pentru găsirea problemei:

  1. Găsiți instrucțiunea header() care cauzează problema. Eroarea trebuie să fie pe sau înainte de această linie.
  2. Căutați orice instrucțiuni care ar putea direcționa ieșirea către utilizator înainte de această declarație de antet. Dacă găsiți unul sau mai multe, modificați codul pentru a muta instrucțiunea antet înaintea acestora. Declarațiile condiționale complexe pot complica problema, dar pot ajuta și la rezolvarea problemei. Alternativ, puteți utiliza o expresie condiționată în partea de sus a scriptului PHP care determină valoarea antetului cât mai devreme posibil și o setează acolo.
  3. Asigurați-vă că nu există spații în afara etichetelor de început și de sfârșit PHP. În timp ce linia goală înainte de eticheta de start
  4. Dacă salvați fișierul în codificare UTF-8, atunci asigurați-vă că fișierul este salvat fără semnătură (fără BOM). O semnătură este un octet adăugat la începutul fișierului, iar dacă scriptul PHP este salvat în acest format, atunci acest octet va fi perceput ca parte a ieșirii corpului paginii, ceea ce nu ar trebui să fie permis pentru a evita problema pe care o avem. iau în considerare.

Oamenii vin constant la mine cu această eroare și mă întreabă: „ Unde este eroarea?„. De-a lungul întregii perioade de timp am primit cam câteva scrisori de genul acesta 500 , nu mai puțin. Este timpul să terminați cu eroarea „”. În acest articol voi vorbi despre motivele acestei erori, precum și despre cum să o rezolv.

Dacă traduceți această eroare în rusă, veți obține ceva de genul: " Nu se poate modifica antetul deoarece au fost deja trimise"Ce este asta" antete„? Să ne dăm seama.

Când serverul returnează un răspuns către client, altul decât corpul (de exemplu, cod HTML pagini), există și titluri. Acestea conțin codul de răspuns al serverului, prăjitură, codificare și mulți alți parametri de serviciu. Can Script PHP trimite un titlu? Desigur că se poate. Există o funcție pentru asta antet().

Această funcție, de exemplu, este utilizată în mod constant atunci când. Această funcție este utilizată în mod regulat și pentru .

De asemenea, anteturile sunt modificate la trimitere prăjiturăși la începutul sesiunii (funcția session_start()).

Și acum despre de ce încă apare eroarea? Serverul dă întotdeauna antetele serverului mai întâi și apoi corpul. Dacă serverul a returnat deja anteturile, atunci corpul merge și apoi întâlnește unele session_start(). Se pare că nefericitul programator a uitat să trimită antetele înainte de începerea corpului și acum vrea să ajungă din urmă trenul care a plecat deja.

Iată codul cu eroarea „”:



?>

Desigur, asemenea prostii PHP nu iartă. Și ar fi trebuit scris așa:

sesiune_start(); // Să începem sesiunea
?>

Acest script nu va provoca erori, deoarece toate anteturile sunt trimise mai întâi și numai apoi este generat corpul de răspuns al serverului.

Un alt exemplu de cod cu o eroare:

ecou „Bună ziua!”; // Imprimă ceva
sesiune_start(); // Să începem sesiunea
?>

Același lucru, dintr-un motiv oarecare, corpul (sau o bucată din el) este afișat mai întâi și apoi și-au amintit că trebuie să modifice și anteturile.

Care este modalitatea corectă de rescrie acest cod, gândește-te singur.

Un alt exemplu:




Ieșire;
?>

Când autorul unui astfel de cod eșuează, este surprins de această eroare și spune: „Este o coincidență foarte ciudată, când operațiunea este reușită, totul este în regulă, dar când există o eroare, îmi spun Nu pot modifica informațiile antetului - anteturi. trimis deja.” Nu la propriu, dar acesta este ideea.

Problema este aceeași, iar modul corect de a o scrie este:

$eroare = adevărat; // Au existat erori?
if ($error) echo „A apărut o eroare”;
else header("Locație: ".$_SERVER["HTTP_REFERER"]); // Redirecționează înapoi
Ieșire;
?>

Există și erori subtile:

header("Locație: ".$_SERVER["HTTP_REFERER"]); // Redirecționează înapoi
Ieșire;
?>

Eroarea din acest cod apare din cauza unui spațiu, care este prezent înainte . Spațiul este un caracter normal și face parte din corpul răspunsului. Și când serverul îl vede, concluzionează că nu vor mai fi antete și este timpul să scoată corpul.

Există și următoarele erori, care sunt de aceeași natură. Să presupunem că există un fișier a.html:

require_once "a.html";
header("Locație: ".$_SERVER["HTTP_REFERER"]); // Redirecționează înapoi
Ieșire;
?>

Și persoana este sincer surprinsă, de unde vine eroarea dacă nu a scos nimic? Prin urmare, nu trebuie să vă uitați în mod specific 1 fișier și toate fișierele care sunt incluse în acesta. Și în cele care sunt conectate la cele conectate, trebuie să te uiți și să nu existe ieșire.

Și ultimul punct, dar mai dificil. Se pare că uneori această eroare apare chiar și cu codul corect. Atunci asta e tot este o chestiune de codificare. Asigurați-vă că codarea fișierului este " UTF-8 fără BOM"si exact" fără BOM„și nu doar” UTF-8". Pentru că BOM sunt octeții care vin chiar la începutul fișierului și sunt rezultatul.

Sper cu adevărat că acest articol va ajuta la rezolvarea absolută a tuturor problemelor asociate cu eroarea „”, deoarece am încercat să evidențiez toate problemele care apar. Și apoi trebuie să vă întoarceți capul și să vă gândiți, ce este greșit în codul dvs.?