Zßklady protokolu HTTP

Ji°φ Kosek ml.

Slu₧ba World-Wide Web je postavena na t°ech zßkladnφch technologiφch -- HTML, URL a HTTP. HTML je znaΦkovacφ jazyk, kter² slou₧φ k standardnφmu popisu obsahu a struktury webovsk²ch strßnek. URL je specißlnφ druh adres pou₧φvan²ch na Webu -- ka₧dß webovskß strßnka mß svoji jednoznaΦnou adresu prßv∞ v podob∞ URL. HTTP -- Hypertext Transfer Protocol -- je protokol pou₧φvan² p°i komunikaci mezi prohlφ₧eΦi a webovsk²mi servery. Pomocφ tohoto protokolu se k serveru p°enßÜφ URL strßnky, kterou u₧ivatel (p°es sv∙j prohlφ₧eΦ) po₧aduje, a naopak server pomocφ protokolu HTTP odesφlß u₧ivateli zp∞t strßnku zapsanou v HTML.

Pro sprßvnΘ pochopenφ princip∙ CGI-skript∙ je nezbytnß alespo≥ zßkladnφ znalost protokolu HTTP. Proto se v dneÜnφm pokraΦovßnφ serißlu podφvßme na zßkladnφ vlastnosti protokolu HTTP.

Protokol HTTP vychßzφ z architektury klient/server. Klient -- v naÜem p°φpad∞ prohlφ₧eΦ -- se spojφ se serverem a poÜle mu po₧adavek. Server jako reakci na klient∙v po₧adavek zasφlß odpov∞∩. P°esn² formßt po₧adavku a odpov∞di je definovßn ve specifikaci protokolu HTTP. Celou situaci mφrn∞ komplikuje to, ₧e dnes existujφ t°i verze protokolu -- 0.9, 1.0 a 1.1. Formßt po₧adavku a odpov∞di se v jednotliv²ch verzφch odliÜuje.

Obr. 1: Pr∙b∞h komunikace mezi klientem a serverem
Pr∙b∞h komunikace mezi klientem a serverem

HTTP verze 0.9

V HTTP/0.9 je formßt po₧adavku velice jednoduch². Jde o jeden °ßdek, kde je za klφΦov²m slovem GET uvedena cesta k po₧adovanΘmu dokumentu. Pokud chceme pomocφ HTTP/0.9 zφskat nap°φklad dokument http://www.server.cz/~krystof/linky.html, musφme se p°ipojit k poΦφtaΦi www.server.cz na port 80 (standardnφ port slu₧by WWW) a zaslat po₧adavek:
GET /~krystof/linky.html
Jako odpov∞∩ nßm p°ijde obsah souboru linky.html. VÜe si m∙₧eme sami vyzkouÜet a zahrßt si na prohlφ₧eΦ. StaΦφ spustit telnet a p°ihlßsit se k n∞jakΘmu serveru na port 80. Pak napφÜeme HTTP po₧adavek a nechßme se p°ekvapit, co nßm server odeÜle zp∞t (viz obr. 2).

Obr. 2: Komunikace s WWW serverem pomocφ telnetu
Komunikace s WWW serverem pomocφ telnetu

Na tomto mφst∞ musφme p°ipomenout, ₧e cesta za slovem GET nem∙₧e b²t prßzdnß a musφ v₧dy obsahovat alespo≥ lomφtko:

GET /
Mo₧nß vßs napadlo, jak² dokument odeÜle server jako odpov∞∩, pokud v po₧adavku nenφ urΦen p°φmo soubor, ale pouze adresß° (nebo dokonce jen ko°enov² adresß° jako v naÜem p°φklad∞). V tomto p°φpad∞ WWW-server hledß v adresß°i soubor, kter² se jmenuje index.html, default.html Φi welcome.html -- zßle₧φ na konfiguraci. Pokud jej nalezne, odeÜle jej jako odpov∞∩. Pokud takov² soubor neexistuje, odeÜle v²pis obsahu adresß°e (pokud to nenφ v konfiguraci serveru zakßzßno).

JmΘna soubor∙, kterΘ se hledajφ v p°φpad∞ po₧adavku, kter² obsahuje pouze jmΘno adresß°e, lze pro server Apache nastavit v konfiguraΦnφm souboru srm.conf pomocφ direktivy DirectoryIndex. Dφky tΘto vlastnosti m∙₧eme pou₧φvat URL adresy tvaru http://www.server.cz/.

HTTP verze 1.0

V tΘto verzi protokolu HTTP je syntaxe po₧adavku ji₧ o n∞co slo₧it∞jÜφ:
metoda cesta_k_dokumentu HTTP/1.0
hlaviΦky
prßzdnß_°ßdka
Nejpou₧φvan∞jÜφ metodou je GET -- ta slou₧φ k zφskßnφ danΘho dokumentu ze serveru. DalÜφ dv∞ metody, kterΘ m∙₧eme pou₧φt, jsou HEAD a POST. Prvnφ z nich zaÜle pouze hlaviΦky, kterΘ obsahujφ r∙znΘ metainformace o dokumentu -- nap°. datum poslednφ modifikace apod. Metoda POST slou₧φ k odeslßnφ dat z formulß°e na server. V tomto p°φpad∞ za prßzdnou °ßdkou obsahuje po₧adavek jeÜt∞ hodnoty jednotliv²ch polφ formulß°e.

HlaviΦky slou₧φ pro p°enos r∙zn²ch dopl≥ujφcφch informacφ. Ka₧dß hlaviΦka je na samostatnΘ °ßdce a mß tvar jmΘno_hlaviΦky: hodnota. V²znam jednotliv²ch hlaviΦek popφÜeme pozd∞ji. Jejich pou₧itφ je nepovinnΘ a proto nejjednoduÜÜφ po₧adavek v HTTP/1.0 vypadß takto:

GET /~krystof/linky.html HTTP/1.0
prßzdnß_°ßdka
Odpov∞∩ mß v HTTP/1.0 takΘ odliÜn² formßt. Nesestßvß pouze ze samotnΘho obsahu zasφlanΘ strßnky, ale obsahuje i mnoho d∙le₧it²ch a u₧iteΦn²ch informacφ.
HTTP/1.0 stavov²_k≤d stavovΘ_hlßÜenφ
hlaviΦky
prßzdnß_°ßdka
obsah_odpov∞di
Stavov² k≤d je t°φmφstnΘ Φφslo, kterΘ indikuje, jak se povedlo uspokojit po₧adavek. P°ehled stavov²ch k≤d∙ je uveden v tabulce 1.

StavovΘ hlßÜenφ je slovnφ popis stavovΘho k≤du, kter² je pro Φlov∞ka p°eci jen srozumiteln∞jÜφ. Pokud vÜe prob∞hlo v po°ßdku, m∞la by prvnφ °ßdka odpov∞di vypadat nßsledovn∞

HTTP/1.0 200 OK
P°ehled stavov²ch k≤d∙ a hlßÜenφ je v tabulce 1.

Tab. 1: StavovΘ k≤dy a hlßÜenφ HTTP/1.0
K≤dPopis
1xx -- InformaΦnφ k≤dy (nepou₧φvß se)
2xx -- ┌sp∞ÜnΘ vy°φzenφ po₧adavku
200 OK Po₧adavek byl ·sp∞Ün∞ zpracovßn
201 Created V²sledkem po₧adavku je nov∞ vytvo°en² objekt
200 Accepted Po₧adavek byl p°ijat, ale dosud nenφ zpracovßn
200 No content Po₧adavek byl ·sp∞Ün∞ zpracovßn, ale jeho v²sledkem nejsou ₧ßdnß data pro klienta
3xx -- P°esm∞rovßnφ
301 Moved PermanentlyPo₧adovan² objekt byl trvale p°emφst∞n na jinou adresu
302 Moved TemporarilyPo₧adovan² objekt byl doΦasn∞ p°emφst∞n na jinou adresu
304 Not ModifiedObjekt nebyl zm∞n∞n (odpov∞∩ p°i podmφn∞nΘm po₧adavku pomocφ hlaviΦky If-Modified- Since)
4xx -- Chyba klienta
400 Bad Request èpatnß syntaxe dotazu
401 UnauthorizedObjekt je dostupn² pouze po autorizaci
403 Forbidden Po₧adavek je v po°ßdku, ale server nemß povoleno jej vykonat
404 Not Found Po₧adovan² objekt nebyl na serveru nalezen
5xx -- Chyba na stran∞ serveru
500 Internal Server ErrorServeru se n∞co stalo a nem∙₧e vyplnit po₧adavek
501 Not ImplementedServer nepodporuje metodu uvedenou v po₧adavku
502 Bad Gateway Server, pracujφcφ jako gateway, dostal Üpatnou odpov∞∩ od dalÜφho serveru
503 Service UnavailableSlu₧ba je nedostupnß (p°etφ₧enφ, ·dr₧ba serveru)

HTTP verze 1.1

Struktura po₧adavku i odpov∞di z∙stßvß u nejnov∞jÜφ verze HTTP stejnß jako u verze 1.0. P°idßny jsou vÜak novΘ hlaviΦky a n∞kterΘ z nich jsou nynφ i povinnΘ.

P°edchozφ verze protokolu HTTP vytvß°ely pro ka₧d² objekt novΘ spojenφ a potΘ jej pomocφ HTTP p°enesly. Pokud tedy nap°. HTML strßnka obsahovala Φty°i obrßzky, pro jejφ sta₧enφ bylo pot°eba navßzat 5 spojenφ (1 strßnka + 4 obrßzky). Navßzßnφ spojenφ je vÜak nßroΦnΘ jak na Φas, tak na p°enosovou kapacitu sφt∞. HTTP/1.1 proto spojenφ mezi klientem a serverem po vy°φzenφ po₧adavku neuzavφrß, ale umo₧≥uje jej pou₧φt pro p°enos vφce objekt∙. Tφm dochßzφ k uÜet°enφ Φasu pot°ebnΘho k p°enosu webovsk²ch strßnek. Spojenφ m∙₧e ukonΦit klient nebo server tφm, ₧e do po₧adavku/odpov∞di za°adφ hlaviΦku Connection: close.

V ka₧dΘm po₧adavku, kter² vyhovuje standardu HTTP/1.1, musφme pou₧φt hlaviΦku Host. Jako hodnota se uvßdφ domΘnovΘ jmΘno serveru, ze kterΘho po₧adujeme strßnku. NejjednoduÜÜφ po₧adavek pak vypadß takto

GET /~krystof/linky.html HTTP/1.1
Host: www.server.cz
prßzdnß_°ßdka
Pou₧itφ tΘto hlaviΦky je povinnΘ kv∙li virtußlnφm server∙m. Dnes je na Internetu b∞₧nΘ, ₧e poskytovatelΘ p°ipojenφ umo₧≥ujφ na sv²ch serverech vystavovat strßnky sv²m zßkaznφk∙m. Jako slu₧bu nabφzejφ i umφst∞nφ strßnek na adrese typu http://www.firma.cz mφsto obvyklΘho http://www.poskytovatel.cz/firma. Samoz°ejm∞, ₧e poskytovatel na jednom serveru (poΦφtaΦi) vystavuje strßnky n∞kolika firem. ProblΘm je vÜak v tom, ₧e server mß obvykle jen jednu IP-adresu, ke kterΘ se p°ipojujφ klienti. Prohlφ₧eΦ se tedy p°ipojφ k serveru na port 80 a v po₧adavku HTTP/1.0 poÜle pouze cestu k dokumentu. Server nemß Üanci zjistit, z kterΘho virtußlnφho serveru je dokument po₧adovßn. Tato situace se °eÜila p°i°azenφm n∞kolika IP-adres jednomu poΦφtaΦi. Pro ka₧d² virtußlnφ server musela existovat jedineΦnß IP-adresa. V tomto p°φpad∞ ji₧ server podle IP-rozhranφ, ke kterΘmu se prohlφ₧eΦ p°ipojil, mohl urΦit virtußlnφ server, na kter² po₧adavek sm∞°uje.

Toto ne p°φliÜ elegantnφ °eÜenφ zbyteΦn∞ pl²tvalo IP-adresami a kladlo zv²ÜenΘ po₧adavky na konfiguraci serveru p°i p°idßnφ novΘho virtußlnφho serveru. Tφm, ₧e po₧adavky HTTP/1.1 obsahujφ jmΘno serveru, odpadß pot°eba z°izovßnφ novΘ IP-adresy pro ka₧d² virtußlnφ server. Na jednΘ IP-adrese nynφ m∙₧e b²t p°φstupn² neomezen² poΦet virtußlnφch server∙. Jedin²m hßΦkem jist∞ elegantnφho °eÜenφ problΘmu je fakt, ₧e starÜφ prohlφ₧eΦe nepodporujφ HTTP/1.1.

HTTP/1.1 p°idßvß i n∞kolik nov²ch metod po₧adavk∙. Pro pot°eby pohodlnΘho publikovßnφ na Webu jsou to p°edevÜφm metody PUT a DELETE. Prvnφ z nich slou₧φ k ulo₧enφ zaslanΘho objektu (nejΦast∞ji HTML strßnky) na danΘ URL. HTML-editor tak m∙₧e p°φmo na WWW-server ulo₧it nov∞ vytvo°enou nebo modifikovanou strßnku, ani₧ by se o to musel sna₧it u₧ivatel sßm nap°φklad pomocφ FTP. Metoda DELETE slou₧φ k odstran∞nφ strßnky ze serveru. DalÜφ metody TRACE, CONNECT a OPTIONS slou₧φ k zjiÜ¥ovßnφ, analyzovßnφ a nastavenφ zp∙sobu spojenφ.

Nejpou₧φvan∞jÜφ hlaviΦky

Verze protokolu HTTP 1.0 definovala 17 hlaviΦek. HTTP/1.1 tento poΦet jeÜt∞ zv∞tÜilo. My si struΦn∞ objasnφme v²znam nejd∙le₧it∞jÜφch hlaviΦek.

Content-Type

Tato hlaviΦka udßvß typ p°enßÜen²ch dat. Typ dat se zapisuje pomocφ MIME konvence. Pro HTML strßnky mßme typ text/html, pro obyΦejn² text text/plain, obrßzky majφ podle pou₧itΘho formßtu jeden z typ∙ image/gif, image/jpeg nebo image/png. Podle typu dat prohlφ₧eΦ poznß, jak p°φchozφ data interpretovat. HTML strßnka zasφlanß prohlφ₧eΦi jako odpov∞∩, proto mezi hlaviΦkami obsahuje nßsledujφcφ °ßdku
Content-Type: text/html

Location

Tato hlaviΦka obsahuje adresu dokumentu, kter² byl p°esunut. Tuto hlaviΦku server posφlß v p°φpadech, kdy stavov² k≤d po₧adovanΘ operace zaΦφnß na 3. Prohlφ₧eΦ v∞tÜinou automaticky nahraje strßnku, na kterou Location ukazuje. Jako adresu je pot°eba uvΘst ·plnΘ absolutnφ URL. Nap°.
Location: http://manes.vse.cz/~xkosj06/index.html

If-Modified-Since

Pokud v po₧adavku pou₧ijeme tuto hlaviΦku spoleΦn∞ s n∞jak²m datem, server nßm po₧adovan² objekt vrßtφ pouze, pokud byl od zadanΘho data zm∞n∞n. P°. Chceme zφskat dokument pouze, pokud se od 30. b°ezna 1998 zm∞nil:
If-Modified-Since: Mon, 30 Mar 1998 12:00:00 GMT

User-Agent, Server

V hlaviΦce User-Agent posφlß prohlφ₧eΦ svoji identifikaci -- obvykle svΘ jmΘno, Φφslo verze a platformu, na kterΘ je spuÜt∞n. Server naopak obsahuje identifikaci serveru, kter² vy°φdil po₧adavek. P°.:
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) 

Server: Apache/1.3b3
© Ji°φ Kosek 1999