Anteturi de informații neplătite. Cum să găsiți și să depășiți BOM este o greșeală urâtă în WordPress. Când se întâmplă

Înțelegerea antetelor HTTP și a câmpurilor de antet HTTP

Antete HTTP furnizați informații vitale necesare pentru o tranzacție HTTP trimisă prin protocol http.

Formatul general de antet HTTP conține perechi nume - valoare separate prin două puncte în câmpul antet. Fiecare dintre perechile nume-valoare se termină cu o secvență de caractere de întoarcere la cărucior (CR) și o secvență de caractere de avans în linie (LF). Câmpurile goale de la sfârșitul fiecărui antet indică sfârșitul antetului.

Formatul de antet comun urmat de aplicații arată astfel:

Tipuri de antete HTTP

Există patru tipuri de anteturi de mesaje HTTP. Sunt:

  • Antet general
  • Antet cerere
  • antetul răspunsului
  • Antet de entitate

Antet general

Câmpurile de antet general au aplicabilitate comună în mesajele de solicitare și răspuns. Câmpurile de antet se aplică numai mesajului transmis și nu se aplică entității transferate.

Structura unui antet general arată astfel:

Controlul cache-ului câmpul specifică directivele care trebuie urmate de fiecare mecanism de stocare în cache pe un sistem de solicitare și răspuns.

conexiune câmpul permite expeditorului să specifice opțiunile necesare pentru o conexiune. Antetul conexiunii are următorul format:

Data câmpul reprezintă data și ora în timpul inițierii mesajului. Formatul de dată specificat în HTTP arată astfel:

pragma câmpul ajută la includerea unei directive specifice de implementare aplicabile oricărui destinatar într-un sistem de solicitare și răspuns.

Remorcă valoarea câmpului specifică dacă un set de câmpuri de antet din trailerul mesajului este codificat cu codare de transfer în bloc.

Codificarea transferului câmpul indică dacă orice tip de transformare este aplicat corpului mesajului.

Modernizare câmpul permite clienților să specifice protocoale de comunicare suplimentare acceptate. De asemenea, permite serverului să schimbe protocoalele cu protocoalele suplimentare.

Prin intermediul câmpurile sunt câmpuri obligatorii utilizate de proxy și gateway-uri care indică protocoale intermediare. De asemenea, indică destinatarul cererii între agent utilizator și server și răspunsul dintre server și client.

Avertizare câmpul conține informații suplimentare despre starea mesajului și transformările mesajului care nu sunt reflectate în mesaj.

Anteturile de avertizare sunt de obicei trimise cu răspunsuri.

Câmpul antet cerere permite clienților să transmită suplimentar informații despre cerere și informații despre client către server.

Structura antetului unei cereri arată astfel:

Accept câmpul specifică tipurile de media care sunt acceptabile pentru răspuns.

„*” este folosit pentru a grupa tipurile media în interval

„*/*” indică toate tipurile de media

„tip/*” indică toate subtipurile unui tip

Acceptați setul de caractere câmpul indică seturi de caractere acceptabile pentru răspuns. Face clienții capabili să înțeleagă seturi de caractere speciale pentru a semnala serverului să reprezinte documentul în aceste seturi de caractere.

Acceptați codificarea câmpul este similar cu Accept, restricționează codificarea conținutului acceptabil pentru răspuns.

Accept-Limba câmpul este similar cu Accept, restricționează setul preferat de limbi naturale.

Autorizare câmpul este pentru agenții utilizator care doresc să se autentifice cu serverul.

Aştepta câmpul indică comportamentele serverului cerute de un client.

Din câmpul conține adresa de e-mail a unui utilizator care controlează utilizatorul-agent solicitant.

Gazdă câmpul specifică gazda de internet și numărul portului de resurse solicitat de la URI-ul utilizatorului.

Dacă Match câmpul este folosit pentru a face metode condiționale.

Dacă-Modificat-De vreme ce câmpul este folosit pentru a face o metodă condiționată. Dacă varianta solicitată nu este modificată în timpul specificat, entitatea nu va fi returnată de pe server.

Dacă-Niciunul-Se potrivește câmpul permite actualizarea eficientă a informațiilor din cache cu o suprasarcină minimă pentru tranzacție.

Dacă Range câmpul permite clienților să primească o parte din entitatea lipsă sau, în caz contrar, clienții pot cere să trimită întreaga entitate nouă.

Dacă-Nemodificat-De vreme ce câmpul permite serverului să efectueze operația solicitată dacă nu a fost modificat de la ora specificată în acest câmp.

Max Atacanti câmpul oferă mecanisme cu metode TRACE și OPTIONS pentru a limita proxy-urile sau gateway-urile de redirecționare a cererii.

Autorizare proxy câmpul permite clientului să identifice pentru a securiza proxy.

Gamă câmpul specifică entitățile HTTP din mesajele HTTP reprezentate ca o secvență de octeți. Solicitarea de preluare HTTP solicită una sau mai multe sub-gamă de entități folosind metode GET.

Referitor câmpul permite clienților să specifice adresa URI a resursei din care se găsește Request-URI.

TE câmpul indică codul de transfer al extensiei pe care îl poate accepta în răspuns. În plus, indică dacă va accepta câmpuri de trailer în codare de transfer în bloc.

Agent utilizator câmpul conține informații despre agentul utilizator solicitant.

Antet de răspuns HTTP

Câmpul antet răspuns permite serverului să treacă informații suplimentare prin răspunsuri, altele decât răspunsul simplu Status-Line.

Structura antetului răspunsului arată astfel:

Acceptați intervale câmpul permite serverelor să indice acceptarea cererilor de interval de resurse.

Vârstă câmpul indică expeditorul intervalul aproximativ de timp de când serverul a răspuns.

ETag câmpul oferă valoarea curentă a etichetei de entitate pentru o solicitare.

Locație câmp redirecționează destinatarii către alte locații decât Request-URI pentru a finaliza identificarea unei noi resurse.

Autentificare proxy câmpul este o includere obligatorie pentru răspunsul de autentificare proxy.

Reîncercați-După câmpul este utilizat ca răspuns atunci când un serviciu este indisponibil pentru a indica durata perioadei pentru care serviciul va rămâne indisponibil clientului.

Server câmpul conține informații despre software-ul utilizat de server pentru a gestiona cererile.

Varia câmpul indică câmpul de solicitare care determină dacă un cache este eligibil pentru a utiliza răspunsul unei cereri fără revalidarea răspunsului.

WWW-Autentificare câmpul sunt utilizate atunci când un mesaj de răspuns este neautorizat.

Câmpurile de antet de entitate definesc metainformații despre corpul entității sau resursa solicitată. Formatul antetului de entitate arată astfel:

permite câmpul listează setul de metode acceptate de resursele identificate Request-URI.

codificarea continutului câmpul este folosit ca modificator de tip media.

Limbă de conținut câmpul descrie limbajul natural pentru clienții unei entități.

lungimea conținutului câmpul indică dimensiunea unei entități reprezentată în număr zecimal.

locația conținutului câmpul furnizează locația resursei pentru o entitate atunci când aceasta este accesibilă dintr-o altă locație decât Requested-URI.

Conținut-MD5 câmpul oferă verificarea integrității mesajului (MIC) folosind un rezumat MD5 pe corpul entității.

interval de conținut câmpul specifică locul unde trebuie aplicat corpul parțial al întregului organism al entității.

tipul de conținut câmpul indică dacă tipul media al organismului entității este trimis destinatarului sau metoda GET este utilizată pentru a trimite cereri.

Expiră câmpul furnizează data/ora după care răspunsul devine învechit.

Modificat ultima dată câmpul indică data și ora ultimei modificări a variantei.

Ordinea în care numele câmpului apare în antet atunci când este primit este nesemnificativă. În mod convențional, anteturile generale sunt plasate mai întâi, urmate de antetul de cerere sau de răspuns cu antetul de entitate la sfârșit.

Notificare privind drepturile de autor: Vă rugăm să nu copiați sau să traduceți acest articol fără permisiunea prealabilă scrisă a site-ului

HTTP Debugger este un analizor HTTP fără proxy pentru dezvoltatori care oferă posibilitatea de a captura și analiza anteturi HTTP, cookie-uri, parametri POST, conținut HTTP și anteturi CORS din orice browser sau aplicație desktop. Interfață de utilizare minunată și foarte ușor de utilizat. Nu este un proxy, nu există probleme de rețea!

Astăzi am decis să vorbim despre ce înseamnă mesajul „Avertisment: Nu se pot modifica informațiile antetului - anteturile deja trimise de (ieșire a început la /home/...", care a apărut pe pagina site-ului în locul conținutului său principal.
După cum s-a dovedit, rețeaua a scris suficient despre acest subiect, dar nu există instrucțiuni generalizate despre ce înseamnă totul și cum să scapi de el.
Am decis să adăugăm câteva picături la marea vastă de informații despre acest subiect, deoarece ne-am confruntat personal cu această problemă.

În urmă cu ceva timp am efectuat transferul mai multor site-uri clienți de la o găzduire la alta.
Totul a mers bine, site-urile erau disponibile, dar când încerci să mergi la admin. panou, după introducerea login-ului și a parolei, a apărut o pagină albă în locul panoului de control.
Verificat pe alte site-uri - același lucru.
Pentru a afla motive posibile, am activat afișarea erorilor.
Pentru a face acest lucru, trebuie să editați fișierul .htaccess situat în rădăcina site-ului prin FTP, adăugând linia la acesta:

php_flag display_errors activat

După aceea, la intrarea în panoul de administrare, au apărut mai multe mesaje de genul „Atenție: Nu se pot modifica informațiile antetului - anteturi deja trimise de (ieșire a început la /home/.../functions.php:1552) în /home/.../ public_html /wp-login.php pe linia 362" etc.

În urma căutării, s-a găsit informații că acest mesaj informează că informațiile de antet nu pot fi modificate, deoarece anteturile (informațiile despre acestea) au fost deja trimise anterior, iar în continuare între paranteze s-a indicat ce rânduri în ce fișiere a fost aceasta. Terminat.


Titluri (antete) reprezintă informațiile de serviciu ale serverului pe care se află site-ul. Înainte ca browserul să afișeze conținutul site-ului, acesta primește anteturi de la server, care indică diverse date: dacă este activată memorarea în cache a paginii, codificarea acesteia, tipul de conținut al paginii și altele. În sistemele de management al conținutului site-ului, anteturile sunt formate din funcții situate în diferite fișiere de sistem.
Condiție obligatorie Anteturile trebuie trimise înainte de conținutul (conținutul) principal al paginii.


Dacă conținutul site-ului este transmis înaintea antetelor, atunci apare o situație despre care suntem avertizați prin mesajul „Avertisment: Nu se pot modifica informațiile antetului - anteturi deja trimise de...”

În ce situații se poate întâmpla acest lucru? După cum sa menționat deja, în CMS-urile moderne anteturile sunt rezultatul uneia sau mai multor funcții. Funcția în sine este o bucată de cod inclusă între inițiale si finala ?> Etichete.

Orice lucru în afara acestor etichete este considerat conținut al paginii.
Astfel, dacă la începutul paginii există funcții care au ca rezultat anteturi trimise, și primim mesajul „Avertisment: Nu se pot modifica informațiile antetului...”, atunci reiese că unele informații legate de conținutul paginii sunt trimis de pe server înaintea antetelor .

Ce sunt aceste informații și cum să le găsiți. Cel mai adesea acestea sunt spații și linii goale.

Un spațiu sau un șir gol este interpretat ca caractere pentru conținutul principal al paginii, astfel încât o parte din conținutul principal vine înaintea titlurilor și este trimis mai întâi la browser.

Trebuie să descărcați fișierele indicate în mesajele „Avertisment: Nu se pot modifica informațiile antetului...” de pe calculator local, deschideți-l într-un editor de cod (folosesc NotePad++) și verificați cu atenție dacă există linii și spații goale:

În același timp, există unul caracteristică importantă, ceea ce poate crește semnificativ timpul de căutare a unei soluții.
Este posibil ca fișierul să nu conțină linii și spații goale, dar dacă a fost salvat în codificare UTF-8, atunci un caracter străin chiar la începutul documentului poate fi inserat de editorul în care a fost creat fișierul. Acest caracter este un identificator UTF-8 egal cu un spațiu cu lățime zero, care poate să nu fie afișat deloc în editor, dar pe server va fi perceput ca conținut principal și afișat înaintea titlurilor.

Pentru a scăpa de acest identificator, trebuie să re-salvați fișierele descărcate în format UTF-8 fără BOM(UTF-8 fără BOM).

NotePad++ face bine această treabă.

După aceste acțiuni și actualizarea fișierelor de pe server, mesajul ar trebui să dispară și site-ul va funcționa ca de obicei.

Este uimitor cât de mică o greșeală vă poate distruge complet site-ul WordPress. Vorbim, desigur, despre binecunoscutul avertisment de eroare WordPress. Atenție: nu se pot modifica informațiile antetului - anteturile deja trimise de pluggable.php. Dacă sunteți unul dintre cei care s-au confruntat cu această eroare, atunci ați ajuns la locul potrivit. În aceasta, vom discuta în primul rând motivul apariției acestei erori și vom analiza soluțiile care vor rezolva în cele din urmă problema.

Ce se va cere

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

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

Cum se poate modifica informațiile antet - anteturile deja trimise prin eroare apare

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: funcția-mea.php adăpostit în /public_html//wp-content/plugins/my-plugin/) în fruntea suspecţilor. Acesta este codul nostru personalizat care are scopul de a schimba funcționalitatea de bază oferită de WordPress. Funcționalitatea nucleului este î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.

Principala cauză a erorii este extra 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, din cauza faptului că programatorii pot (și de obicei 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 # listată în mesajul de eroare se referă la locația problemei - acest lucru vă va ajuta să rezolvați problema mai rapid și fără agitație.

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

Acum că știți ce cauzează eroarea, puteți trece la remedierea acesteia. 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 a ajutat.

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. Aveți deja informațiile de care aveți nevoie pentru a găsi problema în mesajul de eroare în sine (rețineți că acesta este primul fișier din mesaj). Tot ceea ce este necesar este să deschideți acest fișier prin FTP folosind un client precum FileZilla sau printr-un manager de fișiere.

În esență, tot ce trebuie să aveți grijă aici este să eliminați spațiile suplimentare/liniile goale din fișier. Un loc bun pentru a începe ar fi linia # menționată în mesajul de eroare. Din acest moment, puteți continua să analizați restul fișierului căutând orice 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 trebuie să existe un spațiu înainte sau după etichetă , la fel ca eticheta ?> . De asemenea, ultima linie de cod nu trebuie să se termine cu un spațiu sau o nouă linie suplimentară.

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


ALUZIE: In multe editori de text puteți elimina automat spațiile inutile. De exemplu, pentru a elimina spații suplimentare din editorul Atom, selectați tot codul și mergeți la P pachete -> Spațiu alb -> Eliminare spațiu alb final.

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

Desigur, editarea unui număr de fișiere cu erori poate fi dificilă. Fișierele pot fi legate de un plugin sau o temă pe care tocmai le-ați instalat pe site-ul dvs. sau pot fi chiar fișiere de bază WordPress.

Dacă eroarea este într-adevăr cauzată de un plugin sau de o temă, tot ce trebuie făcut 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 într-o versiune funcțională. Acest lucru va asigura că fișierul defect este reparat în starea initiala, în timp ce restul instalării site-ului dvs. WordPress va rămâne în siguranță. Acum, reîncărcați pagina și asigurați-vă că eroarea este remediată.

In concluzie

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

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

Autor

Elena are o pregătire tehnică profesională în domeniu tehnologia Informatieiși experiență de programare limbi diferite pentru diferite platforme și sisteme. Ea și-a dedicat mai mult de 10 ani sferei web, lucrând cu diverse CMS, precum Drupal, Joomla, Magento și, desigur, cel mai popular sistem de management al conținutului de astăzi - WordPress. Articolele ei sunt întotdeauna tehnice și precise, fie că este vorba despre o recenzie WordPress sau despre cum să vă configurați serverul VPS.

În acest articol, ne vom uita la ce sunt anteturile, fără a intra în detalii, care este responsabil pentru ce. Descrierea rolurilor celor mai comune titluri va fi oferită în articolele următoare.

Toate articolele din serie:

  • Ce sunt anteturile HTTP. Teoria generală.

HTTPînseamnă HyperText Transfer Protocol (Hypertext Transfer Protocol). Un protocol este un set de reguli prin care diferite dispozitive schimb de date. A fost creat în anii 1990. Acum este folosit pe Internet aproape peste tot. Tot ce vedeți în fereastra browserului a fost primit prin acest protocol. Anteturile http sunt probabil principalul lucru în comunicarea între dispozitive. Ele transmit informații de bază despre conexiunea care se stabilește și despre informatii transmise prin această legătură.
Să aruncăm o privire la diagrama de comunicare a celor două dispozitive. Lăsați aceste dispozitive să fie computerul dvs. și un server de pe Internet:

După cum puteți vedea, browserul a trimis o solicitare http. Ar putea arăta cam așa:

GET /other-19 HTTP/1.1
Gazdă: www.scriptsite.ru
Agent utilizator: 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)
Accept: 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
Acceptare-Codificare: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Păstrați-vă în viață: 300
Conexiune: păstrați-vă în viață

În acest caz, prima linie este un șir de interogare, toate celelalte linii sunt anteturi http care conțin informații suplimentare despre cerere, despre clientul care solicită aceste informații și despre multe alte lucruri.
Ca răspuns la solicitarea noastră, serverul poate trimite următoarele antete:

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.6 (24.09.2007)

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=ft47gokfee6amv3eda3k1p93s3; cale=/

Cache-Control: fără stocare, fără cache, revalidare obligatorie, post-verificare=0, pre-verificare=0

Pragma: fără cache

Keep Alive: timeout=10, max=1024

Conexiune: Keep Alive

Transfer-Codificare: fragmentat

Tip de conținut: text/html

Prima linie este linia de stare. Restul liniilor sunt anteturi. În schemă s-a arătat că se încarcă și conținutul paginii. Dar, de obicei, acest conținut nu este afișat în pluginuri care vizualizează anteturi. Și conținutul paginii este just caz special. Conform protocolului, pagina nu trebuie transmisă. În schimb, o imagine, un fișier de sunet și un videoclip pot fi transferate. Și toate au titluri foarte diferite.

Cum să vezi antetele http?

Pentru a vedea anteturile http, recomand următoarele plugin-uri pentru browserul Firefox:

Dacă utilizați browser Chrome, puteți vizualiza toate informațiile făcând clic pe butonul de setări - instrumente - instrumente pentru dezvoltatori. fila rețele.
Utilizatori browser opera Nu pot sfătui nimic, pentru că nu sunt prieten cu acest browser. După instalarea pluginurilor și rularea lor, încercați să reîmprospătați pagina. Veți vedea imediat liste uriașe de solicitări și răspunsuri prin care browserul dumneavoastră a comunicat cu serverul.

Antetele Http și accesarea acestora în php

Dacă sunteți un dezvoltator php, puteți accesa anteturile solicitărilor folosind funcția getallheaders(). Pentru a înțelege cum funcționează, să rulăm următorul cod:

Și obținem o imprimare a unei serii de anteturi.

Dar mai des sunt accesate prin variabila globală $_SERVER. Aproape fiecare antet http are un nume de element similar în această variabilă, format din principiul HTTP_header_name. Deci, pentru același 'User_Agent' există o variabilă $_SERVER['HTTP_USER_AGENT'];

Pentru a obține anteturile pe care serverul le va trimite utilizatorului, utilizați funcția headers_list(). De regulă, serverul compune anteturile obligatorii lipsă deja la sfârșitul lucrării tuturor scripturilor. Prin urmare, această matrice va conține anteturile, fie cele pe care serverul le-a creat înainte de a începe execuția scriptului (și nu vor fi modificate), fie cele pe care le-am setat manual. Le puteți seta manual folosind funcția header ("header text");
Să executăm următorul cod:

Vom vedea o imprimare a antetelor gata pentru a fi trimise în momentul în care funcția este apelată:

Primul antet a fost setat automat și poartă numele serverului pe care rulează scriptul. Al doilea este instalat manual de noi. Dacă browserul avea nevoie de antetul „Fruit”, l-ar lua din răspunsul http al serverului și l-ar folosi. Dar din moment ce browserul nostru nu are nevoie de el, pur și simplu ignoră linia pe care nu o înțelege.

Structura cererii http

Cererea noastră arată astfel:

Prima linie din ea, așa cum am menționat mai devreme, este șirul de interogare. Este format din trei părți:

  • metodă(metoda) - indică ce fel de cerere. Cele mai comune metode sunt: ​​GET, POST, HEAD. Ele vor fi discutate în paragraful următor.
  • cale(cale) - Aceasta este de obicei partea URL care vine după domeniu. De exemplu, dacă intri bara de adresa http://www.scriptsite.ru/about/, valoarea căii va fi /about/.
  • protocol(protocol) - Protocolul de utilizat. Constă de obicei din „HTTP” și versiunea de protocol. De obicei, în browsere moderne se folosește versiunea 1.1

Urmează anteturile sub formă de șiruri de format „Nume: valoare”.
Apropo, datele despre cookie-uri sunt transmise și în această solicitare ca unul dintre anteturi. Majoritatea acestor linii sunt opționale. Interogarea poate fi redusă la două linii în total:

GET /article/show/4/ HTTP/1.1

Gazdă: scriptsite.ru

Metode de solicitare

OBȚINE

Cererea de obținere este de obicei folosită pentru a solicita un document, trecându-i unii parametri.
Aceasta este metoda principală folosită pentru a obține pagini html, imagini, fișiere CSS și JavaScript etc.
Datorită faptului că parametrii pot fi orice, iar serverul nu are restricții cu privire la modul în care sunt procesați, de multe ori metoda pentru solicitările de date este folosită pentru a transfera informații. De exemplu, vom avea o formă ca aceasta

În acest caz, acești parametri vor fi vizibili în bara de adrese a browserului.

POST

Post este metoda folosită pentru a trimite date către server. Deși puteți trimite date către server folosind metoda GET prin bara de adrese a browserului, în majoritatea cazurilor este de preferat să folosiți POST. Trimiterea unor cantități mari de date prin GET este nepractică. În plus, GET are unele restricții care nu permit, de exemplu, publicarea acestui articol pe site-ul meu printr-o singură linie de browser. Solicitările POST sunt cel mai adesea folosite pentru a trimite formulare web. Să modificăm formularul din exemplul anterior, dându-i o metodă POST.

Cu această eroare, ei mă contactează în mod constant și mă întreabă: " Unde este greseala?„. Scrisori similare pentru tot timpul am primit undeva piese 500 , nu mai puțin. Este timpul să terminați deja cu eroarea „”. În acest articol voi vorbi despre cauzele acestei erori, precum și despre cum să o rezolv.

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

Când serverul returnează un răspuns clientului, în plus față de corp (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. Poate sa Script PHP trimite antet? Desigur că se poate. Există o funcție pentru asta antet().

Această funcție, de exemplu, este utilizată în mod constant atunci când . De asemenea funcţie dată folosit în mod regulat în .

De asemenea, anteturile sunt modificate atunci când sunt trimise. prăjiturăși la începutul sesiunii (funcția session_start()).

Și acum de ce mai apare eroarea? Serverul îi dă întotdeauna serverului mai întâi anteturile, 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, iar acum vrea să ajungă din urmă trenul deja plecat.

Iată codul cu eroarea „”:



?>

Desigur, asemenea prostii PHP nu iartă. Și a trebuit să scriu așa:

sesiune_start(); // Și să începem sesiunea
?>

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

Un alt exemplu de cod cu o eroare:

ecou „Bună ziua!”; // Se scoate ceva
sesiune_start(); // Și să începem sesiunea
?>

Același lucru, dintr-un anumit motiv, corpul (sau o bucată din el) este mai întâi afișat, iar apoi și-au amintit că și antetele trebuie modificate.

Cum va fi corect să rescrieți acest cod, gândiți-vă singur.

Alt exemplu:




Ieșire;
?>

Când autorul unui astfel de cod eșuează, este surprins de această eroare și spune: „O coincidență foarte ciudată, când operația este reușită, totul este în regulă, iar când există un fel de eroare, mi se spune Nu pot modifica informațiile din antet - anteturi deja trimise”. 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"]); // Faceți o redirecționare înapoi
Ieșire;
?>

Există și erori subtile:

header("Locație: ".$_SERVER["HTTP_REFERER"]); // Faceți o redirecționare înapoi
Ieșire;
?>

Eroarea din acest cod apare din cauza unui spațiu, care este prezent înainte . Un spațiu este un caracter obișnuit și face parte din corpul răspunsului. Și când serverul îl vede, ajunge la concluzia că nu vor mai fi antete și este timpul să afișeze corpul.

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

require_once "a.html";
header("Locație: ".$_SERVER["HTTP_REFERER"]); // Faceți o redirecționare înapoi
Ieșire;
?>

Și persoana este sincer surprinsă, de unde eroarea, dacă nu a afișat nimic? Deci nu trebuie să te uiț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 moment, dar mai dificil. Se pare că uneori această eroare apare cu codul corect. Apoi toate chestiune de codificare. Asigurați-vă că codarea fișierului este " UTF-8 fără BOM"si exact" fără BOM", nu doar " UTF-8". În măsura în care BOM sunt octeții care merg 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ă acopăr toate problemele care apar. Și apoi trebuie să vă întoarceți și să vă gândiți, ce este greșit în codul dvs.?