Advertisement
  1. Code
  2. Web Development

Záhlaví HTTP pro nechápavé

by
Read Time:21 minsLanguages:

Czech (Čeština) translation by Tereza Foretová (you can also view the original English article)

Ať už jste programátor nebo ne, jste viděli to všude na internetu. V této chvíli adresního řádku prohlížeče zobrazuje něco, co začíná řetězcem "https://". Dokonce i první Hello World skript poslal záhlaví HTTP aniž byste si to uvědomovali. V tomto článku budeme se učit o základní informace o záhlaví HTTP a jak je lze použít v našich webových aplikací.

Co jsou záhlaví HTTP?

HTTP je zkratka pro "Hypertext Transfer Protocol". Celého World Wide Web používá tento protokol. Byla založena počátkem devadesátých let. Téměř všechno, co vidíte v prohlížeči je přenesen do vašeho počítače prostřednictvím protokolu HTTP. Například pokud jste otevřeli tuto stránku článku, váš prohlížeč zřejmě odeslali více než 40 požadavků HTTP a obdržela odpovědi HTTP pro každou.

Hlavičky protokolu HTTP jsou základní součástí těchto požadavků a odpovědí HTTP, a oni nesou informace o prohlížeče klienta, požadovanou stránku, server a další.

Příklad

Když zadáte adresu url v adresním řádku, váš prohlížeč posílá požadavek HTTP a může vypadat například takto:

První řádek je "Řádek požadavku", který obsahuje některé základní informace o požadavku. A zbytek jsou hlavičky protokolu HTTP.

Po této žádosti váš prohlížeč obdrží odpověď HTTP, která může vypadat takto:

První řádek je "Stavový řádek", následuje "Záhlaví HTTP", až do prázdného řádku. Poté začíná "obsah" (v tomto případě, výstup ve formátu HTML).

Když se podíváte na zdrojový kód webové stránky v prohlížeči, zobrazí se pouze část HTML a nikoli záhlaví HTTP, i v případě, že ve skutečnosti byly předány společně jak vidíte výše.

Tyto požadavky jsou také odesílány a přijímány na jiné věci, například obrázky, CSS soubory, soubory JavaScript atd. Právě proto jsem řekl dříve, že prohlížeč poslal alespoň 40 nebo více HTTP požadavky jako je načten jen tuto stránku článku.

A teď začneme revize struktury ve větších podrobnostech.

Jak zobrazit záhlaví HTTP

Používám tyto Firefox extensions analyzovat hlavičky HTTP:

V PHP:

  • getallheaders() získá hlavičky požadavku. Můžete také použít pole $_SERVER.
  • headers_list() získá hlavičky odpovědi.

Dále v článku se budeme vidět některé příklady kódu v PHP.

Struktura HTTP požadavku

První řádek požadavku HTTP se nazývá řádek požadavku a sestává ze 3 částí:

  • "Metoda" označuje, co je to za požadavku. Nejběžnější metody jsou GET, POST a HEAD.
  • "Cesta" je obvykle součástí adresy url, která následuje po hostitele (doména). Například při požadavku na "http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/" , část cesty je "/ návody/ostatní/top-20-mysql Doporučené postupy /".
  • "Protokol" část obsahuje "HTTP" a verzi, která je obvykle 1.1 v moderních prohlížečích.

Zbývající žádosti obsahuje záhlaví HTTP jako "jméno:" hodnota na každém řádku. Tyto obsahují různé informace o požadavku HTTP a váš prohlížeč. Například "User-Agent" řádek obsahuje informace o verzi prohlížeče a operační systém, který používáte. "Accept-Encoding" informuje server, pokud váš prohlížeč může přijmout komprimované výstupní jako gzip.

Možná jste si všimli, že uvnitř hlavičky protokolu HTTP je také přenášena data souboru cookie. A pokud existuje odkazující adresa url, který by byl v záhlaví příliš.

Většina z těchto záhlaví jsou volitelné. Tento požadavek HTTP mohlo být tak malé, jako tento:

A ještě dostanete platnou odpověď z webového serveru.

Metody objektu Request

Tři metody nejčastěji používané požadavků jsou: GET, POST a HEAD. Pravděpodobně již máte zkušenosti s prvními dvěma, od psaní html formulářů.

GET: Načíst dokument

To je hlavní metoda používaná k načtení html, obrázky, JavaScript, CSS, atd. Většina dat, která načte v prohlížeči byl požadován pomocí této metody.

Například při načítání Nettuts + článek, na prvním řádku HTTP požadavku vypadá například takto:

Jakmile zatížení html prohlížeč začne posílat požadavek GET na obrazy, které mohou vypadat takto:

Webové formuláře lze nastavit pomocí metody GET. Zde je příklad.

Po odeslání tohoto formuláře požadavku HTTP začíná takhle:

Můžete vidět, že každý vstup formuláře byl přidán do řetězce dotazu.

PŘÍSPĚVEK: Odesílat Data na server

I když můžete odeslat data na server pomocí GET a řetězec dotazu, v mnoha případech POST bude vhodnější. Odesílání velkého množství dat pomocí GET není praktické a má omezení.

Požadavky POST jsou nejčastěji prodávají ve webových formulářích. Pojďme změnit předchozí příklad formuláře pro metodu POST.

Odesílání formuláře vytvoří požadavek HTTP, jako je tento:

Existují tři důležité věci zde:

  • Cesta na prvním řádku je jednoduše /foo.php a už není žádný řetězec dotazu.
  • Délka obsahu záhlaví Content-Type a byly přidány, které poskytují informace o odesílaná data.
  • Všechna data v nyní odesílána po záhlaví se stejným formátem jako řetězec dotazu.

Požadavky POST metody lze také podat přes AJAX, aplikací, cURL, atd. A všechny souboru odesílání formuláře jsou povinni použít metodu POST.

HLAVA: Načíst záhlaví informace

HLAVA je shodné s GET, s výjimkou server nevrací obsah v odpovědi HTTP. Když odešlete požadavek HEAD, to znamená, že máte zájem pouze kód odezvy a záhlaví HTTP, nikoli samotného dokumentu.

"Když odešlete požadavek HEAD, to znamená, že máte zájem pouze kód odezvy a záhlaví HTTP, nikoli samotného dokumentu."

Touto metodou lze prohlížeč zkontrolovat, pokud dokument byl modifikován, pro účely mezipaměti. Můžete také zkontrolovat, zda dokument existuje vůbec.

Například pokud máte spoustu odkazů na webu, můžete pravidelně zasílat požadavky HEAD na všechny z nich vyhledat nefunkční odkazy. To bude pracovat mnohem rychleji než při použití GET.

Struktura HTTP odpovědi

Po prohlížeč odešle požadavek HTTP, server odpoví odpověď HTTP. S výjimkou obsahu to vypadá takto:

První část data je protokol. To je opět obvykle HTTP/1.x nebo HTTP/1.1 v moderních serverech.

Další část je stavový kód následovaný krátkou zprávu. Kód 200 znamená, že naše GET požadavek byl úspěšný a server vrátí obsah požadovaného dokumentu, hned po záhlaví.

Všichni jsme viděli "404" stránky. Toto číslo ve skutečnosti pochází z části kódu stavu odpovědi HTTP. Je-li požadavek GET by stanovit cestu, že server nemůže najít, to by odpovědět s 404 namísto 200.

Zbytek odpověď obsahuje záhlaví stejně jako požadavek HTTP. Tyto hodnoty mohou obsahovat informace o serverového softwaru, když na stránce/byl soubor naposledy změněn, typ mime atd...

Opět většina z těchto záhlaví jsou vlastně dobrovolná.

Stavové kódy HTTP

  • 200's se používají pro úspěšné požadavky.
  • 300's jsou pro přesměrování.
  • systému se používají, pokud došlo k potížím s požadavkem.
  • pětistému se používají, pokud došlo k potížím se serverem.

200 OK

Jak bylo zmíněno dříve, Tento stavový kód je odeslán jako odpověď na požadavek úspěšný.

206 částečný obsah

Pokud aplikace požaduje pouze rozsah požadovaného souboru, 206 kód je vrácena.

To se nejčastěji používá s download manažerů, které mohou zastavit a obnovit stahování nebo rozdělit stahování na kousky.

404 nebyl nalezen

Když požadovanou stránku nebo soubor nebyl nalezen, kód 404 odpověď odeslaných serverem.

401 neoprávněný

Tento kód odešlete webové stránky chráněné heslem. Pokud nezadáte správně přihlášení, může zobrazit následující v prohlížeči.

Všimněte si, že to platí pouze pro stránky chráněné heslem HTTP, které pop přihlášení výzva jako je tento:

403 Forbidden

Pokud není dovoleno přístup ke stránce, tento kód lze zaslat do vašeho prohlížeče. To se často stává, když se pokusíte otevřít adresu url pro složku, obsahující žádné stránky indexu. Je-li nastavení serveru neumožňují zobrazení obsahu složky, dostanete Chyba 403.

Například na svém místním serveru jsem vytvořil složku images. V této složce jsem dal soubor .htaccess s tímto řádkem: "možnosti - indexy". Nyní když se snažím otevřít http://localhost/images/ - vidím to:

Existují jiné způsoby, ve kterém může být zablokován přístup a 403 lze odeslat. Například můžete blokovat IP adresu, s pomocí některých směrnic htaccess.

302 (nebo 307) dočasně přesunuto & trvale přesunuto 301

Tyto dva kódy se používají pro přesměrování prohlížeče. Například pokud používáte url zkrácení služby, například bit.ly, to je přesně jak jim předávat lidem, kteří kliknutím na jejich odkazy.

302 a 301 jsou zpracovány velmi podobně prohlížečem, ale mohou mít různé významy do vyhledávačů. Například pokud vaše webové stránky je vypnutý, může přesměrovat do jiného umístění pomocí 302. Hledat Motor pavouk bude pokračovat v kontrole vaše stránky později v budoucnu. Ale pokud přesměrování pomocí 301, to vám řekne pavouk že vaše webové stránky trvale přemístit do tohoto umístění. Aby vám lepší představu: http://www.nettuts.com přesměruje na http://net.tutsplus.com/ použití kód 301 místo 302.

500 Vnitřní chyba serveru

Tento kód je obvykle vidět, kdy dojde k chybě webového skriptu. Většina skriptů CGI není výstup chyby přímo do prohlížeče, na rozdíl od PHP. Pokud existuje nějaké závažné chyby, budou jen poslat stavový kód 500. A programátor pak potřebuje k vyhledávání protokolů chyb serveru najít chybové zprávy.

Úplný seznam

Můžete najít úplný seznam kódů stavu HTTP s jejich vysvětlením.

Záhlaví HTTP požadavků HTTP

Nyní kontrolujeme některé z nejběžnějších záhlaví HTTP v požadavky HTTP.

Téměř všechny z těchto záhlaví lze nalézt v poli $_SERVER v PHP. Můžete také použít funkci getallheaders() najednou načíst všechna záhlaví.

Hostitel

Požadavek HTTP je odeslán do určité adresy IP. Ale vzhledem k tomu, většina serverů jsou schopny hostování více webů pod stejnou IP adresu, musí vědět jaký název domény prohlížeč hledá.

To je v podstatě název hostitele, včetně domény a subdomény.

V PHP, můžete nalézt jako $_SERVER ['HTTP_HOST'] nebo $_SERVER ['název_serveru'].

User-Agent

Toto záhlaví může nést několik kusů informace jako například:

  • Název prohlížeče a verze.
  • Název operačního systému a verze.
  • Výchozí jazyk.

To je, jak webové stránky mohou shromažďovat všeobecné informace o systémech, jejich surfaři. Například mohou zjistit, zda surfař se v prohlížeči mobilního telefonu a přesměrovat je na mobilní verzi své webové stránky, která funguje lépe s nízkým rozlišením.

V PHP, můžete nalézt s: $_SERVER ["HTTP_USER_AGENT"].

Přijmout jazyk

Toto záhlaví se zobrazí nastavení výchozího jazyka uživatele. Má-li web různé jazykové verze, můžete přesměrovat nové surfař na základě těchto údajů.

To může nést více jazyků, oddělených čárkami. První z nich je preferovaný jazyk, a každý jiný uvedený jazyk může nést hodnotu "q", což je odhad uživatelské preference jazyka (min. 0 max. (1).

V PHP, můžete nalézt jako: $_SERVER ["HTTP_ACCEPT_LANGUAGE"].

Přijmout kódování

Většina moderních prohlížečů podporu gzip a to odešle v hlavičce. Webový server pak můžete posílat výstup HTML v komprimovaném formátu. To může snížit velikost až o 80 % ušetřit šířku pásma a čas.

V PHP, můžete nalézt jako: $_SERVER ["HTTP_ACCEPT_ENCODING"]. Však použijete-li funkci zpětného volání najednou ob_gzhandler(), zkontroluje tuto hodnotu automaticky, takže není nutné.

If-Modified-Since

Je-li webový dokument je již v mezipaměti v prohlížeči, a to znovu navštívíte, váš prohlížeč můžete zkontrolovat, zda byl aktualizován dokument odeslal toto:

Pokud nebyl změněn od tohoto data, server odešle odpověď kód "304 není změněno" a žádný obsah - a prohlížeč načte obsah z mezipaměti.

V PHP, můžete nalézt jako: $_SERVER ['HTTP_IF_MODIFIED_SINCE'].

Je zde také hlavičku HTTP s názvem Etag, který lze použít k Přesvědčte se, že mezipaměť je aktuální. Promluvíme si o tom krátce.

Soubor cookie

Jak už název napovídá, tento odešle soubory cookie uložené ve vašem prohlížeči pro tuto doménu.

Toto jsou název = hodnota dvojice oddělených středníky. Soubory cookie mohou obsahovat také id relace.

V PHP jednotlivé soubory cookie lze přistupovat s $_COOKIE pole. Přímý přístup k proměnné relace pomocí $_SESSION pole a pokud budete potřebovat id relace, můžete použít funkci session_id() namísto souboru cookie.

Odkazující server

Jak už název napovídá, obsahuje toto záhlaví HTTP odkazující adresy url.

Například pokud přejděte na domovskou stránku Nettuts + a klikněte na odkaz na článek, toto záhlaví je odeslána do prohlížeče:

V PHP můžete nalézt jako $_SERVER ["HTTP_REFERER"].

Možná jste si všimli, že slovo "referrer" je chybně jako "referer". Bohužel se do oficiální specifikace HTTP a zasekl.

Autorizace

Když webová stránka požádá o ověření, prohlížeč otevře přihlašovací okno. Když zadáte uživatelské jméno a heslo do tohoto okna, prohlížeč odešle další požadavek HTTP, ale tentokrát obsahuje toto záhlaví.

Údaje v záhlaví je base64. Například base64_decode('bXl1c2VyOm15cGFzcw==') vrátí "myuser:mypass"

V PHP, můžete nalézt tyto hodnoty jako $_SERVER ['PHP_AUTH_USER'] a $_SERVER ['PHP_AUTH_PW'].

Více na tomto, když mluvíme o záhlaví WWW-Authenticate.

Záhlaví HTTP v odpovědi HTTP

Teď budeme se podívat na některé z nejčastějších HTTP záhlaví v odpovědi HTTP.

V PHP můžete nastavit pomocí funkce funkcí header() hlavičky odpovědi. PHP již odešle určité záhlaví automaticky, pro načítání obsahu a nastavení souborů cookie atd... Můžete vidět záhlaví, které jsou odeslány, nebo odešle pomocí funkce headers_list(). Můžete zkontrolovat, pokud odeslání hlavičky již, s headers_sent() funkce.

Cache-Control

Definice ze w3.org: "pole generál hlavičky Cache-Control se používá k určení směrnic musí být všechny mechanismy ukládání do mezipaměti požadavků a odpovědí řetězci neřídí." "Mechanismy ukládání do mezipaměti" patří brány nebo servery proxy, které mohou používat váš ISP.

Příklad:

"veřejnost" znamená, že odpovědí může být mezipaměti kdokoli. "max-age" označuje, kolik sekund mezipaměť je platný pro. Vaše webové stránky v mezipaměti může snížit zatížení serveru a šířku pásma čímž také zlepšit časy zatížení v prohlížeči.

Ukládání do mezipaměti lze také předejít použití direktivy "no-cache".

Podrobnější informace naleznete v tématu w3.org.

Content-Type

Toto záhlaví označuje "Typ mime" dokumentu. Prohlížeč pak rozhodne, jak interpretovat obsah na základě toho. Například stránky html (nebo PHP skript s html výstup) může vrátit toto:

"text" je typ a podtyp dokladu, je "html". Záhlaví mohou obsahovat také další informace jako je znaková sada.

Pro obrázek ve formátu gif to může být zaslána.

Prohlížeč může rozhodnout použít externí aplikace nebo prohlížeče rozšíření na základě typu mime. To například způsobí, že aplikace Adobe Reader má být načten:

Při načítání přímo, Apache obvykle rozpoznat typ mime dokument a odeslat příslušné záhlaví. Většina prohlížečů mají také některé částky odolnost proti chybám a automatické rozpoznávání typů mime v případě, že záhlaví jsou nesprávné nebo není k dispozici.

Můžete najít seznam běžných typů mime zde.

V PHP můžete použít funkci finfo_file() zjistit typ mime souboru.

Content-Disposition

Toto záhlaví pokyn prohlížeči otevřít pole stahování souboru, místo toho se snaží analyzovat obsah. Příklad:

To způsobí, že prohlížeč k tomu:

Všimněte si, že odpovídající záhlaví Content-Type je třeba zaslat také spolu s tímto:

Content-Length

Když obsah bude přenesen do prohlížeče, server může označit velikost to (v bajtech) pomocí této hlavičky.

To je užitečné zejména při stahování souborů. To je, jak prohlížeč může určit průběh stahování.

Například zde je fiktivní scénář, co jsem napsal, který simuluje pomalé stahování.

Výsledkem je:

Já teď komentář mimo záhlaví Content-Length

Výsledek je:

Prohlížeč lze pouze říct, kolik bajtů byly staženy, ale nevím, celkovou částku. A indikátor průběhu není ukazující pokrok.

ETag

To je další záhlaví, který se používá pro účely mezipaměti. To vypadá takto:

Webový server může odeslat tuto hlavičku s každým dokumentem, slouží. Hodnota může založen na poslední datum změnit, velikost souboru nebo dokonce hodnotu kontrolního součtu souboru. Prohlížeč pak uloží tuto hodnotu, jak ukládá do mezipaměti v dokumentu. Příště prohlížeč požaduje stejný soubor pošle to v požadavku HTTP:

Je-li hodnota Etag v dokumentu odpovídá, server odešle 304 kód namísto 200 a žádný obsah. Prohlížeč načte obsah z mezipaměti.

Poslední změny

Jak už název napovídá, toto záhlaví označuje poslední datum změnit dokumentu ve formátu GMT:

To nabízí další způsob pro Prohlížeč mezipaměti dokumentu. Prohlížeč může odeslat v požadavku HTTP:

Jsme už mluvili o tom dříve v části "If-Modified-Since".

Umístění

Toto záhlaví slouží k přesměrování. Je-li kód odezvy 301 nebo 302, server musí také odeslat tuto hlavičku. Například když jdete na http://www.nettuts.com Váš prohlížeč obdrží toto:

V PHP, můžete přesměrovat surfař například takto:

Ve výchozím nastavení, který odešle odpověď 302 kód. Pokud chcete místo toho odeslat 301:

Set-Cookie

Když webová stránka chce nastavit nebo aktualizovat soubor cookie v prohlížeči, bude používat tuto hlavičku.

Každý soubor cookie je odeslána jako samostatné záhlaví. Všimněte si, že soubory cookie nastavené pomocí JavaScriptu není projít hlavičky protokolu HTTP.

V PHP můžete nastavit soubory cookie pomocí funkce setcookie() a PHP odešle příslušné záhlaví HTTP.

Která způsobuje tuto hlavičku k odeslání:

Pokud datum vypršení platnosti není zadán, je soubor cookie odstraněn při zavření okna prohlížeče.

WWW-Authenticate

Webová stránka může poslat tuto hlavičku k ověření uživatele pomocí protokolu HTTP. Když prohlížeč vidí tuto hlavičku, otevře se dialogové okno přihlášení.

Což vypadá takto:

Tam je sekce v příručce PHP, která obsahuje ukázky kódu, jak to udělat v PHP.

Kódování obsahu

Toto záhlaví je obvykle nastavena při vrácený obsah je komprimován.

V PHP Pokud použijete funkci zpětného volání najednou ob_gzhandler(), nastaví se automaticky za vás.

Závěr

Díky za čtení. Doufám, že tento článek byl dobrým výchozím bodem pro další informace o záhlaví HTTP. Prosím, zanechte vaše připomínky a otázky níže, a budu se snažit reagovat co nejvíce to půjde.

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.