Pro někoho věci samozřejmé, pro mě především tahák. Extrémně dlouhá čísla, tedy ty, co mají více než jednu cifru, si prostě nepamatuji.

Přesměrování se v PHP realizuje tímto kódem:

$code = 301; // kód v rozsahu 300..307
$url = 'http://example.com';
header('Location: ' . $url, true, $code);
die('Pro pokračování prosím <a href="' . htmlSpecialChars($url) . '">klikněte sem</a>.');

Všimněte si, že po volání příkazu header() je nutné skript explicitně ukončit. Není na škodu kvůli agentům, kteří automaticky nepřesměrují, nabídnout textovou zprávu a odkaz.

Typy přesměrování

Význam jednotlivých kódů je podrobně popsán v normě RFC 2616: HTTP/1.1 Redirection. Tady jsou:

300 Multiple Choices – více možností

Existuje několik URL, kam lze přesměrovat (stránky se liší například jazykem). Uživateli nabídněte jejich seznam. Preferovaný cíl je možné uvést v hlavičce Location; ne každý prohlížeč automaticky přesměruje. Používá se zřídka.

301 Moved Permanently – trvale přesunuto

Používejte v případech, kdy na požadovaném URL dříve existoval zdroj, který se nyní (trvale) nachází na nové adrese. Tu uveďte v hlavičce Location. Pokud však byl zrušen, oznamte to kódem 410 Gone.

302 Found – nalezeno

Problematický kód. Oznamuje, že zdroj byl dočasně přesunut jinam a prohlížeč by měl na nové URL přistupovat stejnou metodou (GET, POST, HEAD, …), jako na původní. Navíc u jiných metod než GET a HEAD by měl přesměrování potvrdit uživatel. Většina prohlížečů toto však nerespektuje, metodu změní na GET a potvrzení pak nevyžaduje.

Kód bývá chybně používán místo kódu 303.

303 See Other – pro PRG

Technika Post/Redirect/Get zabraňuje dvojímu odeslání formuláře při reloadu stránky nebo kliknutí na tlačítko zpět. Po odeslání formuláře metodou POST se provede přesměrování metodou GET na další stránku. A k tomu slouží právě kód 303. Tedy konvertuje POST na GET.

304 Not Modified – nezměněno

Pro potřeby kešování. Odpovídá na hlavičku If-Modified-Since, že zdroj se od předchozí návštěvy nezměnil. Odpověď nesmí obsahovat tělo, pouze hlavičky.

307 Temporary Redirect – dočasné přesměrování

Jak jsem zmínil, kód 302 se stal problematickým kvůli nerespektování normy ze strany webdesignérů i tvůrců prohlížečů. Kód 307 je jeho reinkarnace, která už funguje většinou správně. Pomocí něj lze například provést přesměrování metodou POST s přenesením odeslaných dat.