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.
Komentáře
error414 #1
Všimněte si prosím, že po volání příkazu header() je nutné explicitně skript ukončit. Není na škodu kvůli agentům, které automaticky nepřesměrují, nabídnout textovou zprávu a odkaz.
Myslim ze je to take proto ze se i po zadani headrer s location provadi kod zatim.
header('Location: '.$url, true, $code);
// zapisuji do db
// mazu latrine
// atd..
Nekde to dela nekde ne. Nikde jsem nenasel jak se to nastavuje.
Tomáš #2
Ad 302: Predpokladam, ze presmerovani POST stranky na jinou stranku, ktera zpracovava tentyz POST, neni moc castou zalezitosti – ja jsem se s tim tedy zatim nesetkal a ani me nenapada, proc a kde bych to pouzil (vzhledem k potencialnim problemum).
To DGX: nechci se dohadovat, ale 302 Found slysim prvne. Literatura uvadi:
301 Moved Permanently
302 Moved Temporarily
a napr. i vyhledavace s 302 pracuji jako s docasnym presmerovanim. Tam je asi nejvetsi vyuziti, protoze vyhledavace formulare nevyplnuji a tudiz POST je moc nezajima 🙂
Tomáš #3
#2 Tomáš, Hmm ale koukam ze w3.org skutecne pise 302 Found. No teda! 🙂
Filosof #4
Hele Davide, záhada kódů HTTP je přece už dávno odhalena.. 😉
felipe #5
Promiňte, ptám se na něco, co všichni jistě víte, já ale nepochopil. Nedávno mi spadl celý systém, takže nejzobrazovanější stránka z mého webu je e404. :)
Mohl by mi někdo napsat celou syntaxi, jak přesměrovat z e404.php na hlavní stránku mého webu?
Děkuji zdvořile. ,–)
David Grudl #6
#1 error414, je to právě proto, aby se další kód neprováděl
#2 Tomáš, přesměrování POST stránky na jinou POST se moc nepoužívá, právě proto je vhodné použít kód 303. V případě dočasného přesměrování GET se 302 a 307 chovají ekvivalentně.
#4 Filosof, a nechceš doplnit i 3xx? ;)
#5 felipe, přesměrovat není vhodný postup, spíš o chybě informuj. Ale pokud na tom trváš, můžeš použít kód uvedený v tomto článku.
Ještě poznámka k vypisování vlastní chybové stránky s kódem 404. Musí mít velikost alespoň 512 bajtů, jinak ji Internet Explorer nezobrazí a vypíše vlastní upozornění (což platí i pro další kódy 400–505). Ale pozor, v případě použití komprese se počítá velikost zkomprimovaných dat. Doporučuji proto na konec stránky vygenerovat náhodná data:
Petr #7
Šikovný přehled. Přesměrování je pravděpodobně nejčastější úloha, která se v PHP řeší, přesto je většinou špatně, protože funkcí header, jak jsem videl na mnoha webech, si myslí že se skript ukončí, což není pravda
dusoft #8
Pozor: Firefox zjavne varuje pred presmerovanim cez 307 pri pouziti POST a pyta sa uzivatela, ci chce presmerovat aj odoslane udaje z formulara.
Ondra #9
Zajimave a určite se hodi.
Non_E #10
Ahoj, je to fakt zajimave cteni a o ukoncovani skriptu po hlavicce header jsme se presvedcil nedavno, kdy se databaze a zejmena error log plnily dal.
Věroš Kaplan #11
Tohle mnohé to vysvětluje (nemáš v hlavičce webu „spousta znalostí předávaných mimochodem“?)
Ještě dodávám, že MSIE se dá nastavit, aby vždy zobrazovalo chybové stránky, které posílá server prostým vypnutím nastavení: „Zobrazovat podrobné chybové zprávy protokolu HTTP“ (záložka Upřesnit). Ale kouzlo s 512 byty je prostě kouzlo 🙂
Šimon Grimmich #12
Díky za stručný seznam, 3XX cifry mi též dělají potíže
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.