HTTP protokol

Http protokol je způsob, kterým si povídá prohlížeč se serverem, když se stahují stránky.

K čemu je dobré znát HTTP - Jak funguje http protokol - Příklad http komunikace - Kde jsou http hlavičky vidět - Typy odpovědí serveru - Verze HTTP - HTTP 2.0 - Jak nastavit http hlavičky

K čemu je dobré znát HTTP

Pro normální tvorbu stránek je znalost http protokolu vcelku k ničemu. Jakmile ale děláte složitější věci nebo se zajímáte o pokročilejší optimalizaci pro vyhledávače, je lepší vědět, co se mezi serverem a klientem vlastně děje.

Z http hlaviček můžete vyčíst např. informace o přesměrování, kešování, o cookies, o komprimaci nebo třeba o referreru.

Pokud píšete serverové skripty nebo složitější webové programy, je dobré vědět, kdy a jak posílat kterou http odpověď.

Zkratka HTTP znamená HyperText Transfer Protocol, tedy protokol přenášení hypertextu. (Hypertext je text s odkazy.)

Jak funguje http protokol

Povídá si klient se serverem. Klient něco chce a server mu to dá.

Takže http protokol je takový jakoby jazyk, kterým si povídají dva programy. Povídají si po síti, nejčastěji po Internetu.

Klient většinou chce nějakou stránku -- připojí se na server a požádá server o URL stránky. Tato žádost je formulována v HTTP protokolu (samotné připojení na server je přes TCP protokol). Server tuto http žádost zpracuje a pošle zpátky odpověď, která je psaná taktéž v HTTP protokolu. Například pošle klientovi http hlavičky a za nimi text stránky v HTML. Klient odpověď přijme, hlavičky si přečte a stránku zobrazí.

Příklad http komunikace

Čtenář si chce přečíst například tuto stránku. Tato stránka má URL https://www.jakpsatweb.cz/server/http-protokol.html.

  1. Čtenář toto URL zadá do prohlížeče.
  2. Prohlížeč (tedy klient) si vyhodnotí doménu, přes DNS si zjistí, jaké IP adresy se má ptát.
  3. Přes TCP protokol naváže spojení se serverem na zjištěné IP adrese. Teprve nyní začíná HTTP.
  4. Prohlížeč pošle na server toto HTTP volání:

GET /server/http-protokol.html HTTP/1.1
HOST: www.jakpsatweb.cz
 

Malý výklad:

  1. Toto HTTP volání přijde na server, na kterém hostuje doména se jménem www.jakpsatweb.cz. Podle HOST se pozná, kterého virtuálního hostingu se bude požadavek týkat (pokud je jich na serveru více), což pro Apache nejčastěji znamená, do kterého svého adresáře se bude dívat.
  2. Server tedy vidí požadavek

GET /server/http-protokol.html HTTP/1.1

  1. Server se podívá se do kořene dokumentů (to je to první lomítko) do adresáře server/ a vezme soubor http-protokol.html. Z požadavku vidí, že ho má zpět poslat v protokolu HTTP verze 1.1. Připojí před soubor http hlavičky odpovědi a pošle to všechno zpět na klienta. Symbolicky vypadá odpověď takto:

stavová odpověď
hlavička 1
hlavička 2 atd.

prázdný řádek
samotný html dokument

tedy konkrétně třeba takto:

HTTP/1.1 200 OK
Content-type: text/html
Date: Sun, 21 May 2006 17:10:21 GMT


<html>
<head>
<title>stránka</title>
...atd.

  1. Tuto odpověď dostane klient (většinou tedy prohlížeč). Z odpovědi napřed odstraní všechny HTTP hlavičky, čili vše před prvním prázdným řádkem. (Napřed si prohlížeč všechny hlavičky ovšem přečte a zapamatuje, občas se z toho něco použije, například pro kešování nebo cookie). Pak prohlížeč samotný HTML dokument zpracuje = zobrazí čtenáři.

Kde jsou http hlavičky vidět

Http komunikace je schovaná, aby se jí normální lidé nemuseli zabývat.

Jestliže chcete http hlavičky sledovat, máte principiálně tři možnosti:

Zobrazení hlaviček v prohlížeči

Protože do prohlížečů se stránky dostávají s http hlavičkami, prohlížeče hlavičky znají.

Chrome: klávesa F12, karta Netvork nebo Síť. Objeví se seznam načítaných objektů (pokud ne, je potřeba znovu načíst, třeba F5). Pak stačí kliknout na název souboru, měly by se objevit HTTP hlavičky. Hlavičky se přirozeně dělí na hlavičky požadavku (request) a odpovědi (response).

Zobrazení http hlaviček přes Web tools v prohlížeči Chrome. Klávesa F12, Network, vybrat soubor, Headers.
Zobrazení http hlaviček přes Web tools v prohlížeči Chrome. Klávesa F12, Network, vybrat soubor, Headers.

Explorer a Edge: stejný postup. F12, karta Netvork nebo Síť, kliknout na objekt.

Firefox: taky stejně.

On-line sniffer

Dříve jsem nejraději používal on-line sniffer, což je webová stránka, protože to bylo velmi jednoduché. Dnes se občas nějaký web sniffer objeví na různých adresách, tak ho občas používám. Najděte si web sniffer vyhledávačem. 

  1. Do chlívku napíšete URL adresu, které se chcete podívat na zoubek na hlavičky,
  2. a hlavičky se vypíšou na stránce.

Možná existují i jiné podobné sniffery, nevím, nepoužívám je (napište mi).

On-line nástroje používám tehdy, když chci prozkoumat přesměrování, protože to v prohlížeči nedokážu.

Telnet

Drsňáci na zjišťování http hlaviček používají telnet. Telnet je takový zvláštní program fungující na nižší síťové vrstvě, který umožňuje TCP spojení. Každopádně když má člověk trpělivost, může v něm poslat http dotaz na vzdálený server a vidět odpověď. Já jsem se to nikdy pořádně nenaučil, protože jsem většinou za proxy (takže bych se musel telnetit napřed na ni) a taky v telnetu každá chyba znamená, že se musí začínat od začátku, což mě nebaví. Na Linuxu se pro sledování hlaviček dá použít více programů, například netcat.

Typy odpovědí serveru

Když server dostane GET požadavek, může odpovědět v zásadě třemi způsoby:

Každý přesný typ odpovědi je pro jednoduchost číslován trojmístným kódem.  (Například informace o tom, že stránka nebyla nalezena, má kód 404.) Kódem odpovědi se začíná http odpověď ze serveru. Je dobré naučit se nejčastější kódy, protože se s nimi lze potkat dost často.Mimo jiné jsou tyto kódy vidět v serverovém logu. Za trojmístný číselný kód se ještě obvykle přidává anglické vysvětlení (dělá to často i server), to je ovšem nezávazné, podstatné je to číslo.

Níže probírám nejčastější serverové odpovědi.

Bez problému -- 200 OK

V případě, že server požadovaný dokument má a může ho poslat, posílá ho s kódem odpovědi 200. Kód 200 znamená OK, tedy že "vše je v pořádku".

HTTP/1.1 200 OK
Content-Type: text/html

<html> dokument ...
bla bla bla cokoliv ...

Je to jinde -- 301 moved permanently, 302 moved temporarily

Stavové kódy začínající trojkou znamenají, že dokument je jinde, nebo že nastala nějaká podobná lapálie.

Na přesměrování se používají dva kódy, 301 a 302. Kód 301 znamená trvalé přesunutí (moved permanently), kód 302 znamená dočasné přesunutí (moved temporarily nebo též found). V praxi mezi těmito dvěma stavy zásadnější rozdíl není, protože klienti automaticky přecházejí na novou adresu (rozdíl je snad jenom v kešování takové informace na klientovi). Já doporučuji používat spíše 301, protože v praxi má naprostá většina přesunutí trvalý charakter.

Pokud server posílá informaci 301 nebo 302, na další řádek připojuje hlavičku Location, která udává nové URL, na kterém se nyní požadovaný dokument nachází.

HTTP/1.1 301 Moved permanently
Location: http://example.com/cesta/soubor.html
 

Jako správce serveru nebo stránek přesměrovací kódy 301 nebo 302 použijete, když něco bylo na jedné adrese (tam míří odkazy) a už je to na jiné. Jak konkrétní odpověď nastavit, záleží na možnostech serveru (nejčastěji se používá mod_alias, mod_rewrite, příkaz Header v PHP nebo přímo hlavička Location v CGI aplikaci)

Výhodou serverového přesměrování oproti jiným metodám přesměrování je například to, že jej bezvadně chápou všechny vyhledávače i prohlížeče. Prohlížeč se okamžitě po obdržení takovéto odpovědi dotazuje nového zdroje, a tak si uživatel většinou vůbec ničeho nevšimne (pouze se mu v prohlížeči změní adresa).

Nezměněno -- 304 not modified

Při validaci kešovaných stránek posílá prohlížeč požadavek s http hlavičkou if-modified-since, která znamená, že dokument chci, "pokud se změnil" od určité doby. Server takový dotaz vyhodnotí, a pokud se dokument nezměnil, řekne kódem 304, že se nezměnil, a skončí. Jestliže se dokument změnil, posílá normálně odpověď 200 OK a připojí změněný dokument.

Stejnou odpověď server vrací po hlavičce If-None-Match, pokud klient poskytnul stejný etag, jako odpovídá poskytovanému obsahu. Znamená to, že klient má už z dřívějška uložen stejný obsah, takže jej není nutno posílat znovu.

Nenalezeno -- 404 not found

Stavové kódy začínající čtyřkou znamenají, že je něco blbě v požadavku.

Nejpopulárnější a možná nejčastější chybou je situace, kdy klient žádá o něco, co na serveru není. Pak server odpovídá stavovým kódem 404 nenalezeno.

HTTP/1.1 404 Not found

Odbočka: Většina hostingů dovoluje nastavit si vlastní chybovou stránku, což je stránka s informacemi pro toho, kdo zadá špatný dotaz (nebo na něj klikne). Chybová stránka 404 by měla obsahovat informaci, že dokument nebyl nalezen. Chybovou stránku lze myslím vytvořit pro všechny odpovědi začínající čtyřkou a pětkou.

Podobně funguje stavový kód 410 gone. To "gone" znamená bylo tu není tu, havrani na plotu. Odpověď 410 se hodí třeba na inzerát, v němž prodáváte kolo, jenomže už jste ho prodali. Klidně můžete použít odpověď 404 (žádný inzerát na kolo tu není), ale lepší je říct něco jako "ptáte se správně, ale pozdě".

Nemáte oprávnění -- 403 forbidden

S touto odpovědí se můžete setkat, když lezete někam, kam nemáte přístup. Asi nejčastěji se objevuje u požadavku na výpis adresáře, který nemá dovoleno se vypisovat (to souvisí s nastavením serveru, např. na Apache s Options Indexes v souboru httpd.conf nebo v .htaccess). V případě normálního webu nemá moc smysl tuto odpověď někam nastavovat.

Podobně funguje odpověď 401 Autorization required, tedy "požadována autorizace, ale ty ses neautorizoval". Tuto odpověď důvěrně znají sosači porna.

Chyba serveru -- 500 internal server error

Požadavky začínající pětkou signalizují problém na serveru. Asi nejčastější odpověď je 500 Internal server error, tedy "vnitřní chyba serveru" (aneb "chyba není na vašem přijímači"). Pětistovka je způsobena nějakou chybou na serveru, nejčastěji špatně napsaným serverovým programem nebo špatným nastavením serveru. Chybu 500 můžete celkem snadno vyrobit, když si budete hrát s nastavením serveru (httpd.conf nebo .htaccess) či s modulem mod_rewrite.

Další pětkové chyby jsou podobného charakteru jako pětistovka.

V praxi se některé servery občas mohou rozbít ještě víc než na pětistovku, takže pak už vůbec neodpovídají. Taková situace se pozná tak, že klient vyšle požadavek, ale vůbec nedostane odpověď, protože server je buďto úplně na hadry, nebo protože někde cestou vypadla síť, takže se na server nelze dostat. Po nějakém čase to klient vzdá (nejčastěji mají prohlížeče nastaveno 30 sekund) a vyhlásí tak zvaný timeout (čti tajmaut) a pracuje s tím v zásadě stejně jako s odpovědí 404 nebo 500. Timeout nelze považovat za typ serverové odpovědi, ale v praxi je to stejně nepříjemná věc -- chyba není na vašem přijímači, ale nemůžete s tím nic dělat.

Kromě výše zmíněných nejčastějších stavových kódů odpovědí existují další.

Verze HTTP

První byla verze HTTP 0.9

Pak přišla verze HTTP 1.0

Nyní se v naprosté většině případů používá HTTP 1.1. Je nejpokročilejší. Předchozí verze neumožňovaly některé důležité věci.

HTTP 2.0 je nová verze HTTP. Soustředí se zejména na zrychlení přenosu dat.

Pokus se někde setkáte se zkratkou SPDY, tak šlo o výzkumný projekt Googlu, přímý předchůdce HTTP 2.

Https není verzí http, ale je to samostatný protokol. Od http se liší tím, že většina komunikace mezi klientem a serverem je šifrovaná. Mám tu stránky o přechodu na https a o hsts.

HTTP 2.0

HTTP 2.0 je v mnohém podobná HTTP 1.1 a sdílí i většinu příkazů. Hlavní přínosy HTTP2 spočívají v rychlosti přenosu dat.

Předpoklad pro použití HTTP 2.0 je fungování na https. Teoreticky sice může http2 fungovat i bez šifrování, ale vývojáři prohlížečů tvrdí, že HTP 2 bez HTTPS nikdy v žádném prohlížeči fungovat nebude. Takže na http 2 potřebujete https.

Jak nastavit http hlavičky

Je potřeba si trochu ušpinit ruce prací s výpočetní technikou. Možnosti jsou tyto:

Přes HTML, CSS nebo klientský javascript http hlavičky nastavovat nejdou.

Konkrétní http hlavičky

Soupis http kódů odpovědí je asi nejlepší na Wikipedii: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

Myslel jsem si, že budu stíhat popisovat konkrétní hlavičky, ale je jich děsně moc. Pardon, nedávám to.

Je potřeba rozlišovat mezi http hlavičkami požadavku (to jsou ty, které posílá klient = prohlížeč) od http hlaviček odpovědi (ty posílá server). Posílané hlavičky můžete vidět právě ve snifferech a v rozšířeních prohlížeče.

 

Reklama

www.webhosting-c4.cz, extra rychlý SSD webhosting s doménou v ceně
o tvorbě, údržbě a zlepšování internetových stránek

Návody HTML CSS JavaScript Články Ostatní

Encyklopedie FrontPage Reklama PHP Server

Jak psát web píše Yuhů, Dušan Janovský. Kontakt.