HTTP fejlécekről kezdőknek
() translation by (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:
1 |
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 |
2 |
Host: net.tutsplus.com |
3 |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) |
4 |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
5 |
Accept-Language: en-us,en;q=0.5 |
6 |
Accept-Encoding: gzip,deflate |
7 |
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 |
8 |
Keep-Alive: 300 |
9 |
Connection: keep-alive |
10 |
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 |
11 |
Pragma: no-cache |
12 |
Cache-Control: no-cache |
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:
1 |
HTTP/1.x 200 OK |
2 |
Transfer-Encoding: chunked |
3 |
Date: Sat, 28 Nov 2009 04:36:25 GMT |
4 |
Server: LiteSpeed |
5 |
Connection: close |
6 |
X-Powered-By: W3 Total Cache/0.8 |
7 |
Pragma: public |
8 |
Expires: Sat, 28 Nov 2009 05:36:25 GMT |
9 |
Etag: "pub1259380237;gz" |
10 |
Cache-Control: max-age=3600, public |
11 |
Content-Type: text/html; charset=UTF-8 |
12 |
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT |
13 |
X-Pingback: https://net.tutsplus.com/xmlrpc.php |
14 |
Content-Encoding: gzip |
15 |
Vary: Accept-Encoding, Cookie, User-Agent |
16 |
|
17 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
18 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
19 |
<head>
|
20 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
21 |
<title>Top 20+ MySQL Best Practices - Nettuts+</title> |
22 |
<!-- ... rest of the html ... -->
|
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 getallheaders() megszerzi a kérés fejléceket. Használhatod a $_SERVER tömböt is.
- a headers_list() megszerzi a válasz fejléceket.
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:
1 |
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 |
2 |
Host: net.tutsplus.com |
É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:
1 |
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 |
2 |
... |
Amint a html betöltődik, a böngésző elküld egy GET kérést a képeknek, valami ilyesmit:
1 |
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1 |
2 |
... |
A webes űrlapok beállíthatóak a GET módszerre. Itt egy példa erre.
1 |
<form method="GET" action="foo.php"> |
2 |
|
3 |
First Name: <input type="text" name="first_name" /> <br /> |
4 |
Last Name: <input type="text" name="last_name" /> <br /> |
5 |
|
6 |
<input type="submit" name="action" value="Submit" /> |
7 |
|
8 |
</form>
|
Amikor az űrlapot elküldjük, a HTTP kérés valahogy így fog kezdődni:
1 |
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1 |
2 |
... |
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.
1 |
<form method="POST" action="foo.php"> |
2 |
|
3 |
First Name: <input type="text" name="first_name" /> <br /> |
4 |
Last Name: <input type="text" name="last_name" /> <br /> |
5 |
|
6 |
<input type="submit" name="action" value="Submit" /> |
7 |
|
8 |
</form>
|
Az űrlap elküldése egy ilyen HTTP kérést hoz létre:
1 |
POST /foo.php HTTP/1.1 |
2 |
Host: localhost |
3 |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) |
4 |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
5 |
Accept-Language: en-us,en;q=0.5 |
6 |
Accept-Encoding: gzip,deflate |
7 |
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 |
8 |
Keep-Alive: 300 |
9 |
Connection: keep-alive |
10 |
Referer: http://localhost/test.php |
11 |
Content-Type: application/x-www-form-urlencoded |
12 |
Content-Length: 43 |
13 |
|
14 |
first_name=John&last_name=Doe&action=Submit |
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.
1 |
order allow,deny |
2 |
deny from 192.168.44.201 |
3 |
deny from 224.39.163.12 |
4 |
deny from 172.16.7.92 |
5 |
allow from all |
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.
1 |
Host: net.tutsplus.com |
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
1 |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) |
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.
1 |
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) { |
2 |
echo "Please stop using IE6!"; |
3 |
}
|
Accept-Language
1 |
Accept-Language: en-us,en;q=0.5 |
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ó.
1 |
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') { |
2 |
header('Location: http://french.mydomain.com'); |
3 |
}
|
Accept-Encoding
1 |
Accept-Encoding: gzip,deflate |
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.
1 |
// enables output buffering
|
2 |
// and all output is compressed if the browser supports it
|
3 |
ob_start('ob_gzhandler'); |
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:
1 |
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT |
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.
1 |
// assume $last_modify_time was the last the output was updated
|
2 |
|
3 |
// did the browser send If-Modified-Since header?
|
4 |
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { |
5 |
|
6 |
// if the browser cache matches the modify time
|
7 |
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { |
8 |
|
9 |
// send a 304 header, and no content
|
10 |
header("HTTP/1.1 304 Not Modified"); |
11 |
exit; |
12 |
}
|
13 |
|
14 |
}
|
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.
1 |
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar |
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.
1 |
echo $_COOKIE['foo']; |
2 |
// output: bar
|
3 |
echo $_COOKIE['PHPSESSID']; |
4 |
// output: r2t5uvjq435r4q7ib3vtdjq120
|
5 |
session_start(); |
6 |
echo session_id(); |
7 |
// output: r2t5uvjq435r4q7ib3vtdjq120
|
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:
1 |
Referer: https://net.tutsplus.com/ |
PHP-ben ez $_SERVER['HTTP_REFERER']-ként található meg.
1 |
if (isset($_SERVER['HTTP_REFERER'])) { |
2 |
|
3 |
$url_info = parse_url($_SERVER['HTTP_REFERER']); |
4 |
|
5 |
// is the surfer coming from Google?
|
6 |
if ($url_info['host'] == 'www.google.com') { |
7 |
|
8 |
parse_str($url_info['query'], $vars); |
9 |
|
10 |
echo "You searched on Google for this keyword: ". $vars['q']; |
11 |
|
12 |
}
|
13 |
|
14 |
}
|
15 |
// if the referring url was:
|
16 |
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
|
17 |
// the output will be:
|
18 |
// You searched on Google for this keyword: http headers
|
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.
1 |
Authorization: Basic bXl1c2VyOm15cGFzcw== |
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:
1 |
Cache-Control: max-age=3600, public |
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.
1 |
Cache-Control: no-cache |
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:
1 |
Content-Type: text/html; charset=UTF-8 |
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:
1 |
Content-Type: image/gif |
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:
1 |
Content-Type: application/pdf |
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:
1 |
Content-Disposition: attachment; filename="download.zip" |
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:
1 |
Content-Type: application/zip |
2 |
Content-Disposition: attachment; filename="download.zip" |
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).
1 |
Content-Length: 89123 |
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.
1 |
// it's a zip file
|
2 |
header('Content-Type: application/zip'); |
3 |
// 1 million bytes (about 1megabyte)
|
4 |
header('Content-Length: 1000000'); |
5 |
// load a download dialogue, and save it as download.zip
|
6 |
header('Content-Disposition: attachment; filename="download.zip"'); |
7 |
|
8 |
// 1000 times 1000 bytes of data
|
9 |
for ($i = 0; $i < 1000; $i++) { |
10 |
echo str_repeat(".",1000); |
11 |
|
12 |
// sleep to slow down the download
|
13 |
usleep(50000); |
14 |
}
|
Az eredmény:



Most kikommentelem a Content-Length fejlécet
1 |
// it's a zip file
|
2 |
header('Content-Type: application/zip'); |
3 |
// the browser won't know the size
|
4 |
// header('Content-Length: 1000000');
|
5 |
// load a download dialogue, and save it as download.zip
|
6 |
header('Content-Disposition: attachment; filename="download.zip"'); |
7 |
|
8 |
// 1000 times 1000 bytes of data
|
9 |
for ($i = 0; $i < 1000; $i++) { |
10 |
echo str_repeat(".",1000); |
11 |
|
12 |
// sleep to slow down the download
|
13 |
usleep(50000); |
14 |
}
|
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:
1 |
Etag: "pub1259380237;gz" |
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:
1 |
If-None-Match: "pub1259380237;gz" |
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:
1 |
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT |
1 |
$modify_time = filemtime($file); |
2 |
|
3 |
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT"); |
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:
1 |
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT |
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:
1 |
HTTP/1.x 301 Moved Permanently |
2 |
... |
3 |
Location: https://net.tutsplus.com/ |
4 |
... |
PHP-ben így irányíthatod át a szörfölőt:
1 |
header('Location: https://net.tutsplus.com/'); |
Alapértelmezésben egy 302-es válaszkódot fog küldeni. Ha helyette 301-et szeretnél küldeni:
1 |
header('Location: https://net.tutsplus.com/', true, 301); |
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.
1 |
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT |
2 |
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT |
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.
1 |
setcookie("TestCookie", "foobar"); |
Aminek következtében ez a fejléc lesz elküldve:
1 |
Set-Cookie: TestCookie=foobar |
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.
1 |
WWW-Authenticate: Basic realm="Restricted Area" |
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
1 |
if (!isset($_SERVER['PHP_AUTH_USER'])) { |
2 |
header('WWW-Authenticate: Basic realm="My Realm"'); |
3 |
header('HTTP/1.0 401 Unauthorized'); |
4 |
echo 'Text to send if user hits Cancel button'; |
5 |
exit; |
6 |
} else { |
7 |
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; |
8 |
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>"; |
9 |
}
|
Content-Encoding
Általában ez a fejléc van beállítva, amikor a visszatérő tartalom tömörített.
1 |
Content-Encoding: gzip |
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.