Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

HTTP fejlécekről kezdőknek

by
Difficulty:IntermediateLength:LongLanguages:

Hungarian (Magyar) translation by Szabó Péter (you can also view the original English article)

Akár programozó vagy, akár nem, biztos beleakadtál már a weben. A böngésződ címsora most valami olyasmit mutat, ami "https://"-rel kezdődik. Már a legelső Hello World szkripted is küldött HTTP fejléceket anélkül, hogy erről tudtál volna. Ebben a cikkben megtanítunk a HTTP fejlécek alapjaira, és hogy hogyan használhatjuk őket a webes alkalmazásainkban.

Mik azok a HTTP fejlécek?

A HTTP a "Hypertext Transfer Protocol" rövidítése. Az egész World Wide Web ezt a protokollt használja. Az 1990-es évek elején alakult ki. Majdnem minden, amit a böngésződben látsz, a számítógépedre a HTTP-n keresztül érkezik. Például amikor megnyitod ennek a cikknek az oldalát, a böngésződ valószínűleg 40 HTTP kérést küld és egy HTTP válaszüzenetet kap.

A HTTP fejlécek alapvető részei ezeknek a HTTP kéréseknek és válaszoknak, és információkat hordoznak a kliens böngészőről, a kért oldalról, a szerverről és még sok másról.

Példa

Amikor begépelsz egy url-t a címsorba, a böngésződ egy ilyesmi kinézetű HTTP kérést küld el:

Az első sor a "Request Line", ami néhány alap információt tartalmaz a kérésről. A többi részét pedig a HTTP fejlécek alkotják.

A kérés után a böngésződ egy HTTP választ kap, ami valahogy így néz ki:

Az első sor a "Status Line" (státuszsor), amit a "HTTP headers" (HTTP fejlécek) követ. Ezután kezdődik a "tartalom" (ami ebben az esetben egy HTML kimenet).

Amikor megnézed egy weboldal forráskódját a böngésződben, akkor csak a HTML részt fogod látni, a HTTP fejléceket pedig nem, még akkor sem, ha valójában a kettőt együtt küldik, ahogyan az fent is látható.

Ezek a HTTP kérések más dolgokat is küldenek és fogadnak, például képeket, CSS és JavaScript fájlokat, stb. Ezért mondtam korábban, hogy a böngésződ legalább 40 vagy több HTTP kérést küldött, amint betöltötted ezt a cikket.

Most nézzük át a szerkezetét részletesebben.

Hogyan nézd meg a HTTP fejléceket

Én a következő Firefox bővítményeket használom a HTTP fejlécek elemzéséhez:

PHP-ben:

A cikk további részeiben fogunk látni néhány példakódot PHP-ben.

HTTP kérés szerkezete

A HTTP kérés első sorát kéréssornak nevezik és 3 részt tartalmaz:

  • A "módszer" a kérés fajtájára utal. A leggyakoribb módszerek a GET, a POST és a HEAD.
  • Az "útvonal" általában az url azon része, ami a host (domain) után következik. Például amikor a "https://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/"- kérjük , az útvonal rész "/tutorials/other/top-20-mysql-best-practices/" lesz.
  • A "protokoll" rész tartalmazza a "HTTP"-t és a verziót, ami a modern böngészőknél általában 1.1.

A kérés fennmaradó része HTTP fejléceket tartalmaz "Név: Érték" párokban, minden egyes sorban. Ezek különféle információkat tartalmaznak a HTTP kérésről és a böngésződről. Például a "User-Agent" sor információkat ad az általad használt böngésző verziójáról és az operációs rendszeredről. Az "Accept-Encoding" azt mondja meg a szervernek, hogy a böngésződ képes-e tömörített outputot, pl.: gzipet fogadni.

Talán észrevetted, hogy a süti információ is el lett küldve egy HTTP fejléccel. Amennyiben van egy hivatkozó URL, akkor az is benne lesz a fejlécben.

A fejlécek többsége opcionális. Ez a HTTP kérés lehetne ilyen rövid is:

És mégis megfelelő választ kapnál a webszervertől.

Kérési módok

A három leggyakrabban használt kérési mód: GET, POST és HEAD. Már valószínűleg ismerős neked az első kettő a html űrlapok készítéséből.

GET: Egy dokumentum fogadása

A HTML, a képek, a JavaScript, CSS, stb. dokumentumok fogadásának ez a fő módszere A legtöbb adat, ami a böngésződbe betöltődik, ennek a módszernek a használatát követeli meg.

Például amikor egy Nettuts+ cikket töltesz be, a legelső sora a HTTP kérésnek valami ilyesmi lesz:

Amint a html betöltődik, a böngésző elküld egy GET kérést a képeknek, valami ilyesmit:

A webes űrlapok beállíthatóak a GET módszerre. Itt egy példa erre.

Amikor az űrlapot elküldjük, a HTTP kérés valahogy így fog kezdődni:

Láthatod, hogy minden űrlap beviteli mező hozzá lett adva a kérés karakterláncához.

POST: Adatküldés a szervernek

Bár küldhetsz a GET és a kérés karakterlánc használatával is adatokat a szervernek, sok esetben a POST-ot részesítik előnyben. Nagy mennyiségű információ küldése a GET-tel nem praktikus és vannak korlátai is.

A POST kéréseket leggyakrabban webes űrlapok küldésére használják. Változtassuk meg az előző űrlap példánkat POST módszerre.

Az űrlap elküldése egy ilyen HTTP kérést hoz létre:

Három fontos dolog van, amit érdemes itt észrevenni:

  • Az útvonal az első sorban csak /foo.php, és nincs ott már a kérés karakterlánc.
  • Content-Type és Content-Length fejlécek lettek hozzáadva, amik információkkal szolgálnak az elküldött adatokról.
  • Minden információ a fejlécek után kerül elküldésre, ugyanolyan formátumban, mint a karakterlánc.

POST módszer kérések készíthetőek AJAX-szal, alkalmazásokkal, cURL-lel, stb.-vel is. És minden fájlfeltöltő űrlap köteles a POST módszert használni.

HEAD: Fejléc információk fogadása

A HEAD ugyanolyan, mint a GET, azzal a különbséggel, hogy a szerver nem küldi el a tartalmat a HTTP válaszban. Amikor egy HEAD kérést küldesz, az azt jelenti, hogy csak a válaszkód és a HTTP fejlécek érdekelnek téged, nem pedig maga a dokumentum.

"Amikor egy HEAD kérést küldesz, az azt jelenti, hogy csak a válaszkód és a HTTP fejlécek érdekelnek téged, nem pedig maga a dokumentum."

Ezzel a módszerrel tudja a böngésző ellenőrizni, hogy a dokumentum lett-e módosítva, gyorsítótárazási okokból. Azt is ellenőrizheti, hogy létezik-e egyáltalán a dokumentum.

Például ha sok link van a weboldaladon, időnként tudsz küldeni HEAD kéréseket mindegyiknek, hogy ellenőrizd a működésüket. Ez sokkal gyorsabban működik, mint a GET használata.

HTTP válasz szerkezete

Miután a böngésző elküldi a HTTP kérést, a szervere egy HTTP válasszal reagál. Beleveszi a tartalmat is, valahogy így:

Az adat első része a protokoll. Ez általában szintén HTTP/1.x vagy HTTP/1.1 a modern szervereken.

A következő rész az állapotkód, amit egy rövid üzenet követ. A 200-as kód azt jelenti, hogy a GET kérésünk sikeres volt és a szerverünk visszaküldi a kért dokumentum adatait, közvetlenül a fejlécek után.

Mindannyian láttunk már "404" oldalakat. Ez a szám valójában a HTTP válasz állapotkódjából származik. Ha történik egy GET kérés, és a szerveren nem található útvonalra irányul, akkor a válasz 404 lesz a 200 helyett.

A válasz többi része olyan fejléceket tartalmaz, mint a HTTP kérés. Ezek az értékek információkat tartalmazhatnak a szerver szoftveréről, hogy mikor volt az oldal/fájl utoljára módosítva, a mime típusról, stb...

Ismétlésképp mondom, hogy ezen fejlécek többsége valójában opcionális.

HTTP állapotkódok

  • a 200-asok a sikeres kérésekre használatosak.
  • a 300-asok az átirányításokra.
  • a 400-asok akkor használatosak, ha egy probléma van a kéréssel.
  • az 500-asok szerverproblémakor használatosak.

200 OK

Ahogy azt már korábban említettem, ez az állapotkód lesz kiküldve válaszként egy sikeres kérésre.

206 Partial Content

Ha egy alkalmazás csak az állomány egy részét kéri, akkor a 206-os kóddal tér vissza.

Ezt leginkább az olyan letöltéskezelők használják, amik meg tudnak állítani és tudnak folytatni egy letöltést, vagy a letöltést feldarabolják.

404 Not Found

Amikor a kért oldal vagy fájl nem található, a szerver egy 404-es válaszkódot küld.

401 Unauthorized

Ezt a kódot jelszóval védett weboldalak küldik. Ha nem megfelelően jelentkeztél be, akkor a következőt láthatod a böngésződben.

Figyelj rá, hogy ez csak a HTTP jelszóval védett oldalakra vonatkozik, amik ilyesfajta bejelentkezési ablakot dobnak fel:

403 Forbidden

Ha nem engedélyezett számodra egy oldal elérése, ez a kód lesz kiküldve a böngésződnek. Ez gyakran megtörténik, amikor egy olyan mappa url-t próbálsz megnyitni, ami nem tartalmaz index oldalt. Amennyiben a szerverbeállítások nem engedélyezik a mappa tartalmának megmutatását, akkor egy 403-as hibát kapsz.

Például, a helyi szerveremen létrehoztam egy images mappát. Ebbe a mappába tettem egy .htaccess fájlt ezzel a sorral: "Options -Indexes". Most ha megpróbálom megnyitni a http://localhost/images/ címet – ezt látom:

Más módokon is történhet a hozzáférés tiltása, olyankor is 403-as kód kerül elküldésre. Például tilthatsz IP-cím alapján, némi htaccess utasítás segítségével.

302 (vagy 307) Moved Temporarily és 301 Moved Permanently

Ezt a két kódot a böngésző átirányítására használják. Például amikor egy olyan url rövidítő szolgáltatást használsz, mint a bit.ly, az pontosan ily módon továbbítja az embereket, akik a linkjeikre kattintanak.

A 302 és 301 nagyon hasonlóképp van kezelve a böngészők által, de különböző jelentésük van a keresőmotor robotok számára. Például ha a weboldalad karbantartás miatt bezár, akkor átirányíthatod egy másik helyre a 302 használatával. A keresőmotor robotok majd valamikor a későbbiekben fogják leellenőrizni az oldaladat. De ha 301-es átirányítást használsz, azzal azt mondod a robotoknak, hogy a webhelyed véglegesen elköltözött. Hogy jobb képet kapj: a http://www.nettuts.com átirányít a https://net.tutsplus.com/-ra a 301-es kód használatával a 302 helyett.

500 Internal Server Error

Ezt a kódot általában akkor látjuk, amikor egy webes szkript lefagy. A legtöbb CGI szkript – a PHP-től eltérően – nem jelenít meg hibákat közvetlenül a böngészőben. Ha valami komoly hiba van, akkor csak kiküld egy 500-as állapotkódot. És a programozónak ezután át kell néznie a szerver hibanaplóit, hogy megtalálja a hibaüzenetet.

Teljes lista

A HTTP állapotkódok teljes listáját, a magyarázataikkal együtt itt találod.

HTTP fejlécek a HTTP kérésekben

Most megnézünk néhányat a leggyakoribb HTTP fejlécek közül, amik a HTTP kérésekben találhatóak.

Majdnem minden fejléc megtalálható a $_SERVER tömbben PHP-ben. Használhatod a getallheaders() függvényt is, ha minden fejlécet egyszerre szeretnél megkapni.

Host

Egy HTTP kérés lett elküldve adott IP-címekre. De mivel a legtöbb szerver képes több weboldalt is kiszolgálni ugyanaz alatt az IP-cím alatt, tudniuk kell, hogy a böngésző melyik domain nevet keresi.

Ez alapvetően a kiszolgáló neve, benne a domainnel és az aldomainnel.

PHP-ben $_SERVER['HTTP_HOST'] vagy $_SERVER['SERVER_NAME'] alatt található.

User-Agent

Ez a fejléc több információdarabot is hordozhat, mint:

  • Böngésző neve és verziója.
  • Operációs rendszer és verziója.
  • Alapértelmezett nyelv.

Így tudnak a weboldalak összegyűjteni bizonyos általános információkat az őket böngészők rendszereiről. Például észlelheted, ha a felhasználó a mobiltelefonja böngészőjét használja, és átirányíthatod őket a weboldal mobil változatára, ami jobban működik az alacsonyabb felbontásokon.

PHP-ben a $_SERVER['HTTP_USER_AGENT']-nél találod meg.

Accept-Language

Ez a fejléc a felhasználónál alapértelmezettnek beállított nyelvet mutatja. Ha egy weboldal eltérő nyelvi verziókat használ, egy új felhasználó átirányítható ez alapján.

Több nyelvet is tartalmazhat, vesszőkkel elválasztva. Az első az előnyben részesített nyelv, és minden további nyelv hordozhat egy "q" értéket, ami egy becslés arra, hogy felhasználó mennyire részesíti előnyben a nyelvet (min. 0, max. 1).

PHP-ben a $_SERVER["HTTP_ACCEPT_LANGUAGE"] alatt található.

Accept-Encoding

A legtöbb modern böngésző támogatja a gzipet, és ezzel a fejléccel küldi el. A webszerver ezután elküldheti a HTML kimenetet tömörített formában. Ez akár 80%-kal is lecsökkentheti annak méret, ezáltal sávszélességet és időt megspórolva.

PHP-ben ez $_SERVER["HTTP_ACCEPT_ENCODING"]-ként található meg. Ugyanakkor ha az ob_gzhandler() visszahívási függvényt használod, akkor az automatikusan ellenőrzi ezt az értéket, így neked nem kell majd megtenni.

If-Modified-Since

Ha egy webes dokumentum már gyorsítótárazva van a böngésződben és újra meglátogatod, akkor a böngésződ ezt kiküldve leellenőrizheti, hogy a dokumentum frissült-e:

Ha ezóta nem lett módosítva, a szerver egy "304 Not Modified" válaszkódot fog küldeni, tartalom nélkül – és a böngésző a tartalmat a gyorsítótárból fogja betölteni.

PHP-ben $_SERVER['HTTP_IF_MODIFIED_SINCE']-ként található meg.

Van egy Etag nevű fejléc is, ami használható arra, hogy meggyőződjünk a gyorsítótár aktualitásáról. Hamarosan erről is szót ejtünk.

Cookie

Ahogy a neve is sugallja, ez cookie-kat (sütiket) tárol a böngésződben a domainről.

Ezek a név=érték párok pontosvesszőkkel vannak egymástól elválasztva. A sütik munkamenet azonosítókat (session id) is tartalmazhatnak.

A PHP-ben az egyedi sütik a $_COOKIE tömbbel érhetőek el. A munkamenet változókat közvetlenül is elérheted a $_SESSION tömbbel, és ha a session id-re van szükséged, akkor használhatod a session_id() függvényt is a süti helyett.

Referer

Ahogy a neve is mondja, ez a HTTP fejléc a hivatkozó URL-t tartalmazza.

Például ha meglátogatom a Nettuts+ kezdőoldalt és rákattintok egy cikk linkjére, ezt a fejlécek küldi el a böngészőmnek:

PHP-ben ez $_SERVER['HTTP_REFERER']-ként található meg.

Talán észrevetted, hogy a "referrer" szót félrebetűzték "referer"-nek. Sajnos ez így került be a hivatalos HTTP specifikációba és ott is ragadt.

Authorization

Amikor egy weboldal engedélyezést kér, a böngésző egy bejelentkezési ablakot nyit meg. Amikor beírsz egy felhasználónevet és jelszót ebbe az ablakba, a böngésző egy újabb HTTP kérést küld, de ezúttal ezt tartalmazza a fejléc.

Az adat a fejlécben base64 kódolású. Például a base64_decode('bXl1c2VyOm15cGFzcw==') 'myuser:mypass'-szal fog visszatérni.

PHP-ben ezek az értékek megtalálhatóak itt: $_SERVER['PHP_AUTH_USER'] és $_SERVER['PHP_AUTH_PW'].

Továbbiakat erről majd akkor írok, amikor a WWW-Authenticate fejlécről beszélünk.

HTTP fejlécek HTTP válaszokban

Most megnézünk néhányat a HTTP válaszokban található leggyakoribb HTTP fejlécekből.

PHP-ben a válasz fejléceket a header() használatával állíthatod be. A PHP bizonyos fejléceket automatikusan elküld, például a tartalom betöltéséhez, a sütik beállításához, stb. Az elküldött vagy elküldendő fejléceket megnézheted a header_list() függvénnyel. A headers_sent() függvénnyel ellenőrizheted, hogy a fejlécek el lettek-e már küldve.

Cache-Control

Meghatározás a w3.org-tól: A Cache-Control általános fejléc mező arra használatos, hogy olyan utasításokat fogalmazzon meg, amelynek MINDEN gyorsítótárazási mechanizmusnak engedelmeskednie kell a kérés/válasz láncolat során." Ezek a "gyorsítótárazási mechanizmusok" magukba foglalják az átjárókat és proxykat, amiket az ISP-d használhat.

Például:

A "public" azt jelenti, hogy a választ bárki gyorsítótárazhatja. A "max-age" azt jelzi, hogy a gyorsítótár hány másodpercig érvényes. Ha engedélyezed a weboldaladnak, hogy gyorsítótárazzák, az lecsökkenti a szerver és a sávszélesség terhelést, valamint javít a böngésző betöltési idején.

A gyorsítótárazás megakadályozható a "no-cache" utasítás használatával.

További részletes információkért nézd meg a w3.org-ot.

Content-Type

Ez a fejléc a dokumentum "mime típusát" jelzi. A böngésző ez alapján dönti el, hogy hogyan értelmezze a tartalmat. Például egy html oldal (vagy egy PHP szkript html kimenete) visszatérhet ezzel:

A "text" a dokumentum típusa és a "html" az altípusa. A fejléc tartalmazhat olyan információkat is, mint a karakterkódolás.

Egy gif képnél valami ilyesmit küld:

A böngésző a mime típus alapján eldöntheti, hogy egy külső alkalmazást vagy egy bővítményt akar-e használni. Például ennek eredményeképp az Adobe Reader fog betöltődni:

Amikor közvetlenül töltődik be, az Apache általában azonosítja a dokumentum mime típusát és elküldi a megfelelő fejlécet. A legtöbb böngészőnek van némi hibatűrése és automatikus érzékelése a mime típusokhoz, arra az esetre, ha a fejlécek hibásak vagy hiányoznak.

Itt megtalálhatod a gyakori mime típusok listáját.

PHP-ben a finfo_file() függvényt használhatod egy fájl mime típusának meghatározására.

Content-Disposition

Ez a fejléc utasítja a böngészőt, hogy nyisson meg egy fájl letöltési dobozt a tartalom feldolgozása helyett. Például:

Ennek hatására a böngésző ezt csinálja:

Figyeld meg, hogy a megfelelő Content-Type fejléc is el lesz küldve vele együtt:

Content-Length

Amikor egy tartalom elküldésre kerül a böngészőhöz, ezzel a fejléccel a szerver jelezheti annak méretét (bájtokban).

Ez különösen fájl letöltéseknél hasznos. Ebből tudja a böngésző megállapítani, hogy hol áll a letöltés.

Például itt egy kezdetleges szkript amit én írtam, és ami egy lassú letöltést szimulál.

Az eredmény:

Most kikommentelem a Content-Length fejlécet

Az eredmény most:

A böngésző most csak azt tudja megmondani, hogy hány bájtot töltött le, de nem tudja a teljes mennyiséget. És a folyamatjelző nem mutatja az előrehaladást.

Etag

Ez egy másik fejléc, amit gyorsítótárazási céllal használnak. Így néz ki:

A webszerver elküldheti ezt a fejlécet minden dokumentummal, amit szolgáltat. Az érték az utolsó módosítás dátumán, a fájlméreten vagy akár a fájl ellenőrzőösszegén is alapulhat. A böngésző ezután elmenti ezt az értéket, amikor a dokumentumot gyorsítótárazza. Amikor a böngésző ismét kéri ezt a fájlt, akkor ezt a HTTP kérést küldi el:

Ha a dokumentum Etag értéke egyezik ezzel, a szerver egy 304-es kódot küld a 200-as helyett, tartalmat pedig nem. A böngésző a tartalmat a saját gyorsítótárából fogja betölteni.

Last-Modified

Ahogy a neve is sugallja, a fejléc a dokumentum utolsó módosításának dátumát jelzi, GMT formátumban:

Ez egy újabb módot kínál a böngészőnek egy dokumentum gyorsítótárazására. A böngésző elküldheti ezt a HTTP kérésben:

Korábban már beszéltünk erről az "If-Modified-Since" részben.

Location

Ez a fejléc az átirányításokhoz használatos. Ha a válaszkód 301 vagy 302, akkor a szervernek ezt a fejlécet is el kell küldenie. Például amikor a http://www.nettuts.com-ra mész, a böngésződ ezt fogja kapni:

PHP-ben így irányíthatod át a szörfölőt:

Alapértelmezésben egy 302-es válaszkódot fog küldeni. Ha helyette 301-et szeretnél küldeni:

Set-Cookie

Amikor egy weboldal szeretne beállítani vagy frissíteni egy sütit a böngésződben, akkor ezt a fejlécet fogja használni.

Minden sütit egy külön fejléccel küld el. Figyeld meg, hogy a JavaScripttel beállított sütik nem mennek keresztül a HTTP fejléceken.

PHP-ben a sütiket a setcookie() függvénnyel állíthatod be, és a PHP a megfelelő HTTP fejléceket fogja elküldeni.

Aminek következtében ez a fejléc lesz elküldve:

Ha nincs beállítva a lejárati dátum, a süti törölve lesz a böngészőablak bezárásakor.

WWW-Authenticate

Egy weboldal küldheti ki ezt a fejlécet, hogy HTTP-n keresztül azonosítson egy felhasználót. Amikor a böngésző látja ezt a fejlécet, egy bejelentkezési párbeszédablakot fog megnyitni.

Ami valahogy így néz ki:

Van egy rész a PHP kézikönyvben egy kódmintával arról, hogy hogyan lehet ezt PHP-vel megcsinálni

Content-Encoding

Általában ez a fejléc van beállítva, amikor a visszatérő tartalom tömörített.

Ha PHP-ben az ob_gzhandler() visszahívó függvényt használod, akkor automatikusan elküldi ezt neked.

Konklúzió

Köszönöm, hogy elolvastad. Remélem, hogy ez a cikk jó kiindulópont volt a HTTP fejlécekhez. Kérlek szólj hozzá vagy kérdezz lentebb, és én megpróbálok rá válaszolni, ahogy csak tudok.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.