PHP - 13. díl – kouzla s funkcí header

V dnešním dílu seriálu o PHP bude pojednávat detailně o funkci header a možnostech s tím spojených.

Funkce header - úvod

K pochopení funkce header je potřeba trochu osvětlit, jak pracují hlavičky a HTTP protokol. Jednoduše se dá napsat, že při odesílání webové stránky směrem k uživateli vše probíhá ve dvou fázích. Nejdříve se odešlou hlavičky HTTP protokolu, kterým se vlastně stránky přenáší. A pak se odešle samotný obsah stránky, tedy nejčastěji HTML kód stránky.

V hlavičkách HTTP protokolu se přenášejí nejrůznější údaje, a pomocí PHP funkce header můžete přidávat svoje vlastní údaje a ovlivňovat tak spoustu věcí. Důležité ovšem je, abychom funkci leader použili dříve, než vypíšeme jakýkoli výstup týkající se vlastní webové stránky. Jakmile totiž cokoli vypíšeme třeba pomocí echo, nelze už žádnou hlavičku HTTP protokolu odeslat a použití funkce header skončí chybou.

Samotné hlavičky HTTP protokolu nejsou nic jiného, než textové řetězce. Proto vhodně zvolenými textovými řetězci můžeme ovlivňovat průběh posílání webové stránky.

Přesměrování stránky

Jednu z věcí, kterou lze pomocí hlaviček HTTP protokolu zařídit, je přesměrování stránky. Jedná se o to, že prostě prohlížeči řekneme, aby natáhnul jinou stránku, než tu, kterou právě načítá. Třeba následující příklad, pokud si jej zkusíte spustit skončí natáhnutím úvodní stránky Computer pressu:

<?php
  header(`Location: http://www.cpress.cz/`);
?>

Důležité je, aby začátek skriptu, tj. <?php byl skutečně na prvním řádku, a nebyla předtím žádná mezera. Jinak by to nefungovalo.

Můžete svojí stránku přesměrovat kamkoli, záleží jenom na tom, jakou adresu uvedete za dvojtečkou po slově Location. Můžete samozřejmě použít celý svůj arzenál PHP znalostí a kombinovat funkci header s jakýmkoli dalším PHP kódem. Například následující kód vás dopoledne přesměruje na Vltava.cz a odpoledne na stránky Cpress.cz:

<?php
  if (date(`A`) == `AM`)
    header(`Location: http://www.vltava.cz/`);
  else
    header(`Location: http://www.cpress.cz/`);
?>

Jak vidíte, síla přesměrování pomocí funkce header je v tom, že můžete přesměrovávat kamkoli, a dokonce se v průběhu zpracování PHP skriptu rozhodnout, kam bude přesměrováno. Po přesměrování už nemá smysl cokoli vypisovat ve vašem vlastním skriptu, protože by to stejně nemělo být zobrazeno. Proto se často používá přikaz exit jako pojistka proti dalšímu vykonávání skriptu. Příkaz exit okamžitě ukončuje provádění PHP skriptu, takže se dále nepokračuje. Proto první příklad i s příkazem exit by vypadal takto:

<?php
  header(`Location: http://www.cpress.cz/`);
  exit;
?>

Funkce headers_sent

Protože hlavičky HTTP protokolu musí být poslány dříve, než jakýkoli výstup ve skriptu, může PHP odesílat hlavičky jen do té doby, dokud neprovedeme nějaký výstup. Někdy ve složitějších PHP skriptech je těžké poznat, zda již nějaký výstup byl, nebo ne. A v tomto přichází na pomoc funkce headers_sent, která jednoduše informuje, jestli už byly hlavičky HTTP protokolu poslány. Pokud byly hlavičky poslány, znamená to, že už nějaký výstup, třeba pomocí příkazu echo, nebo jinak, byl proveden. A pak už není možné žádné hlavičky poslat.

Jak to dopadne, pokud nějaký výstup už byl poslán si snadno můžeme vyzkoušet na příkladu:

<?php
  echo `ahoj`;
  header(`Location: http://www.cpress.cz/`);
  exit;
?>

Pokud zkusíme tento příklad, PHP skript vypíše text "ahoj", a pak chybové hlášení v anglickém jazyce. Tím nám sděluje, že hlavičky už byly poslány, protože jsme už cosi vypsali na výstup. A že nemůže naši hlavičku přidat k seznamu hlaviček, prostě funkce header totálně selže.

Pokud bychom se chtěli chybové zprávy vyvarovat, můžeme použít právě funkce headers_sent ke zjištění, jestli poslat hlavičku můžeme, a nebo už to nejde:

<?php
  echo `ahoj<br>`;
  if (headers_sent())
    echo `nejde odeslat hlavičku`;
  else
    header(`Location: http://www.cpress.cz/`);
  exit;
?>

Pokud si výše uvedený příklad spustíme, žádné chybové hlášení už nevznikne, ale pouze se nám vypíše "nejde odeslat hlavičku". Všimněte si, mimochodem, prázdných kulatých závorek za headers_sent v příkladu. Žádná funkce, i když nemá žádné parametry, nesmí být ošizena o kulaté závorky.

Pokud si předchozí příklad zmodifikujeme tak, aby nevypisoval "ahoj", není žádný problém hlavičku odeslat a přesměrovat tak na www.zive.cz:

<?php
  if (headers_sent())
    echo `nejde odeslat hlavičku`;
  else
    header(`Location: http://www.cpress.cz/`);
  exit;
?>

Vypnutí cacheování stránky

Zkusíme teď další fígl. Každý prohlížeč, nebo proxy cache, se snaží pamatovat si poslední stránky. To je na jednu stranu příjemná věc, protože šetříme tak linku k internetu. Na druhé straně nám tak může prohlížeč, nebo proxy cache tvrdošíjně nabízet staré stránky, které už mezitím byly aktualizovány, ale prohlížeč si to třeba nemyslí.

Proto existují i hlavičky, které určují, jak dlouho bude stránka ještě platná, případně i hlavičky, které pamatování si stránek přímo zakazují. Pokud vám tedy někdy prohlížeč nechce tvrdošíjně načíst nový obsah stránek, i když jste svoje stránky změnily, zkuste použít tvrdý kalibr na začátku své webové stránky:

<?php
  header(`Expires: Mon, 26 Jul 1997 05:00:00 GMT`);
  header(`Last-Modified: `.gmdate(`D, d M Y H:i:s`).` GMT`);
  header(`Cache-Control: no-cache, must-revalidate`);
  header(`Pragma: no-cache`);

  // Tady pokračuje váš PHP skript.
?>

Výše zmíněný příklad obsahuje čtyři hlavičky, které donutí prakticky každý prohlížeč, nebo proxy cache přestat si stránku pamatovat, a vždy znovu a znovu natahovat stránku čerstvou. Někdy vám to může velmi pomoci. Dobré bude, když si zmíněnou kombinaci hlaviček dáte na každou stránku, která se často mění. Může to být třeba stránka novinek, nebo podobně.

Dnes jsem popsal některé možnosti odesílání hlaviček HTTP protokolu a příště téma dokončím dílem o zasílání a přijímání cookies, které k hlavičkám také patří.

Diskuze (31) Další článek: SCO prodělává, začíná propouštět

Témata článku: , , , , , , , , , , , , , , , ,