În această notă introductivă, vom analiza funcțiile standard PHP pentru lucrul cu anteturile HTTP. Vom analiza în detaliu toate avantajele și dezavantajele acestor funcții.
Funcția header ()
Funcția header () scrie următorul antet la matricea antetului răspunsului HTTP curent. Funcția are un argument obligatoriu șir de șir, care trebuie să conțină un șir de antet.
Al doilea argument opțional înlocuire bool permite sau dezactivează modul de suprascriere a valorii header. Dacă argumentul este adevărat, noile anteturi vor înlocui anteturile deja scrise cu același nume. Dacă argumentul este fals, noua valoare a antetului existent va fi adăugată la antetul anterior, separată printr-o virgulă. De exemplu: PHP Ca rezultat, antetele răspunsului vor avea un antet cu două valori HTTP. Cu toate acestea, dacă cunoașteți imediat toate valorile acestui antet, este mai ușor să le scrieți într-o singură linie: PHP
Al treilea parametru opțional int http_response_code poate conține un cod de stare (cod de răspuns), conform căruia bara de stare va fi modificată.
Cu toate acestea, în ciuda faptului că funcția header () are bara de titlu în forma sa brută, nu este atât de liberală să scrie titluri în orice ai trece. Există anumite limitări privind formatul anteturilor înregistrate. În cazul în care nu sunt îndeplinite cerințele, acesta este, cel mai bun caz, duce la lipsa liniei de așteptat, vă titluri transferate la client. În cel mai rău caz, clientul va primi un răspuns cu un cod de stare de 500 erori interne de server.
Funcțiile header () pot fi transmise două tipuri de linii: o bară de stare și anteturi HTTP.
Următoarea restricție se aplică antetelor HTTP transmise: ele trebuie să conțină numele și valoarea antetului, separate de un caracter colon. Dacă nu există nume, valoare sau lipsește un colon, atunci această linie nu este tratată ca un antet și este ignorată. În plus, numele titlului ar trebui să conțină numai caractere ASCII. Nu există alte restricții privind numele și semnificațiile. Puteți să vă creați propriile titluri și să le trimiteți pe cineva care vă place. În conformitate cu standardul protocolului HTTP, antetele necunoscute trebuie să fie transmise pe toate părțile lanțului, iar browserele ar trebui să le ignore atunci când interpretează anteturile.
Unul dintre avantajele incontestabile ale funcției header () este că poate modifica șirul de stare de răspuns HTTP. Bara de stare este întotdeauna prima linie din matricea antetului și are următorul format: HTTP
Versiunea de protocol poate fi una specifică, de exemplu 1.0 sau 1.1, sau una comună, de exemplu 1.x. Cu toate acestea, când am încercat să scriu o versiune specifică a protocolului, am constatat că clientul trimite în continuare un șablon comun 1.x. Poate că nu e vina PHP, ci serverul Apache, care cumva procesează anteturile înainte de a le trimite.
Codul de stare este un cod numeric asociat unui anumit tip de răspuns. Procesarea codurilor de stare inexistente depinde de versiunea serverului Apache. Versiunile mai vechi nu permit trimiterea de coduri de stare incorecte. Dacă încercați să transmiteți un cod de stare necunoscut (de exemplu 430 sau 600), clientul primește un răspuns cu o eroare: HTTP
Cu toate acestea, în noua versiune de Apache 2 este posibil să trimiteți coduri de stat inexistente. Pentru un cod de stat inexistent, Apache 2 adaugă o frază explicativă "OK".
O frază explicativă nu poate fi transmisă deloc. Dacă nu îl transmiteți, Apache îl va adăuga, pe baza codului de stare. Dacă treceți o frază explicativă arbitrară, aceasta va fi rescrisă la fraza standard bazată pe codul de stare transmis.
Funcția header () are un comportament special când se adaugă antetul Locație. În plus față de adăugarea acestui antet, funcția schimbă bara de stare în HTTP / 1.x 302 Found. Dar dacă trebuie să setați un alt cod de stare, de exemplu 307 Redirecționarea temporară, atunci trebuie să apelați funcția header () în plus pentru a schimba bara de stare. Nu contează dacă acest lucru se face înainte de adăugarea antetului Locație sau după - modificările vor fi salvate și trimise clientului. Dar există un mod mai elegant de a folosi al treilea argument int http_response_code. Antetul locației cu codul de stare 307 poate fi adăugat într-o singură linie după cum urmează: PHP
În lumina modificărilor din PHP 4.3.0 care au permis modificarea barei de stare în acest fel, devine complet lipsită de sens să se modifice explicit bara de stare (cu excepția clarității). La urma urmei, după cum am văzut mai sus, antetul funcției () reacționează numai la codul de stare pe care îl trimiteți în bara de stare. Iar versiunea protocolului și fraza explicativă Apache o plasează încă la discreția sa. Codurile de stare nevalide din argumentul http_response_code sunt tratate exact la fel ca atunci când le transmiteți în bara de stare. Pentru mai multe informații despre codurile de stare fără legături PHP, consultați articolul despre codurile de stare HTTP.
Când se utilizează funcția header (), este important să rețineți că înregistrarea antetelor de răspuns este posibilă numai până când ieșirea a început să iasă. Odată ce afișați datele de pe ecran (designul de ecou, de imprimare, de imprimare_f, etc., sau doar de text sau de spații în afara etichetelor ), împreună cu aceste prime date, sunt trimise și anteturile de răspuns. Dacă după aceea încercați să înregistrați antetul de răspuns, veți primi următorul avertisment:
Avertisment: Nu se pot modifica informațiile din antet - anteturile trimise deja de către
și apoi este raportat fișierul scriptului PHP și linia de cod în care a fost pornită ieșirea la fluxul de ieșire.
Funcția headers_list ()
Funcția headers_list () este disponibilă numai cu a cincea versiune a PHP. Se returnează numai anteturile care au fost adăugate din scriptul PHP. Dacă nu ați scris nicio antet, funcția va returna numai antetul X-Powered-By: PHP / 5.2.10. și apoi nu întotdeauna. Desigur, nu poate fi altfel, deoarece toate celelalte anteturi sunt înregistrate de server după executarea scriptului PHP.
Mai mult, această funcție nu returnează o bară de stare, chiar dacă a fost schimbată dintr-un script PHP.
Funcția headers_sent ()
O funcție de depanare care indică faptul că anteturile răspunsului HTTP curent sunt trimise clientului. Doi parametri opționali ne permit să scrie în numele variabilelor trecut la script PHP (primul argument) și numărul liniei (al doilea argument), care a început producția în fluxul de ieșire la care au fost trimise titluri.
Funcția getallheaders ()
Această funcție funcționează numai dacă PHP rulează ca un modul Apache. Pentru a face acest lucru mai evident, deoarece PHP 4.3.0 această funcție a primit aliasul apache_request_headers ()
precum și toate variabilele de mediu cu numele "HTTP_MY_TAG", care sunt create de serverul bazat pe anteturile cererii HTTP actuale. Exemple de alte variabile de mediu care conțin anteturile de solicitare sunt: $ _SERVER ['HTTP_KEEP_ALIVE']. $ _SERVER ['HTTP_CACHE_CONTROL']. $ _SERVER ['HTTP_REFERER']. Aceste elemente ar putea să nu existe în matrice, cu excepția cazului în care clientul a trecut antetele corespunzătoare ale solicitărilor.
Din păcate, ceea ce nu poate fi cunoscut este versiunea client a protocolului HTTP, care este conținut în șirul de interogare.
Unul dintre avantajele getallheaders () pentru matrice $ _SERVER este că oferă numele antete în forma lor originală, în timp ce „HTTP_“ prefix este adăugat la matrice $ _SERVER la numele antet. Cu toate acestea, având în vedere faptul că numele de titluri sunt sensibile la majuscule, clientul poate transfera numele în litere mici și litere mari pot fi cu sau, în cazuri excepționale, în orice versiune registre exotice. Acest lucru este complicată de căutare pentru titluri interesante în matrice, care oferă getallheaders funcția (). Cu matrice $ _SERVER aceasta nu este o problemă - există toate cheile unei matrice este întotdeauna în litere mari.
Funcția get_headers ()
Înainte de PHP 5.3.0, această caracteristică are un dezavantaj, ceea ce limitează utilizarea sa numai în scopul depanării. Conform logicii protocolului HTTP, această funcție ar trebui să implementeze interogarea folosind metoda HEAD, deoarece este interesat doar de titluri. Cu toate acestea, atunci când apelați această funcție, PHP trimite o cerere la serverul de la distanță după cum urmează: HTTP
Firește, această interogare returnează serverul de la distanță este nu numai prima pagină a ziarelor, dar conținutul resursei care este în comparație cu antetul ocupă un volum de uneori de sute de ori mai mare. Astfel, nu este extrem de rațional anchetă sens Polarizarea ambele servere și routere de rețea și gateway-uri între ele. Dezvoltatorii de protocol HTTP luptă puternic pentru atenuarea povara tot mai mare de pe rețea și software cum ar fi soluțiile get_headers () funcția, sau mai degrabă utilizarea lor necugetată reduce aceste eforturi la zero.
Cu toate acestea, în versiunea 5.3.0 a acestei versiuni, acest defect a fost fixat cu apariția funcției stream_context_set_default (). Din versiunea 5.1.3, funcția get_headers () utilizează contextul de flux implicit implicit. Dar setările pentru contextul de flux pot fi modificate numai din versiunea 5.3.0, de exemplu, modificați metoda de interogare. PHP
Desigur, trebuie să faceți acest lucru înainte de a apela get_headers ().
Modul de cerere HTTP HTTP a fost introdus înapoi în HTTP / 1.0 Această metodă a fost dezvoltată doar pentru astfel de cazuri. Specificația RFC 1945 specifică faptul că această metodă este identică cu metoda GET, cu excepția faptului că nu returnează conținutul resursei. Adevărul din specificația RFC 2616 pentru protocolul HTTP / 1.1 este că returnarea antetelor identice în comparație cu metoda GET are un nivel de cerință SHOULD, adică de preferință, dar nu neapărat (pentru mai multe detalii, consultați nota privind metoda HEAD). Cel mai popular server Apache acceptă această cerință. Îndrăznesc să presupun că și alte servere îl susțin.