Přesměrování pod HTTP
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.
Na vlastní oči
Chování prohlížečů si můžete otestovat na hřišti. Bábovičky a formulář POST jsou připraveny, tak šup na to.
Komentáře » přidat
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat
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.
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
[2] Tomáš: Hmm ale koukam ze w3.org skutecne pise 302 Found. No teda!
Hele Davide, záhada kódů HTTP je přece už dávno odhalena..
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. ,–)
[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 3×x? ;)
[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:
Š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
Pozor: Firefox zjavne varuje pred presmerovanim cez 307 pri pouziti POST a pyta sa uzivatela, ci chce presmerovat aj odoslane udaje z formulara.
Zajimave a určite se hodi.
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.
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
Díky za stručný seznam, 3XX cifry mi též dělají potíže