Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

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 Redi­rection. 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.

napsáno 21. 9. 2006 | shlédnuto 17590x | nahoru

Komentáře RSS 2.0 komentářů » přidat

avatar

#1 error414 http://www.error414.com nový

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.

Posláno 21. 9. 2006 v 8.04 | Odpovědět
Na komentář reagoval [6] David Grudl

#2 Tomáš http://www.quax.cz nový

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 :-)

Posláno 21. 9. 2006 v 11.09 | Odpovědět
Na komentář reagoval [3] Tomáš [6] David Grudl

#3 Tomáš http://www.quax.cz nový

#2 Tomáš: Hmm ale koukam ze w3.org skutecne pise 302 Found. No teda! :-)

Posláno 21. 9. 2006 v 11.12 | Odpovědět

#4 Filosof http://blog.filosof.biz/ nový

Hele Davide, záhada kódů HTTP je přece už dávno odhalena.. ;-)

Posláno 21. 9. 2006 ve 12.11 | Odpovědět
Na komentář reagoval [6] David Grudl
avatar

#5 felipe http://felipe.ic.cz nový

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. ,–)

Posláno 21. 9. 2006 v 16.09 | Odpovědět
Na komentář reagoval [6] David Grudl
avatar

#6 David Grudl http://davidgrudl.com nový

#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:

echo '<!-- ';
$i = 1e3;
while (--$i) echo chr(rand(63, 126));
echo ' -->';
Posláno 21. 9. 2006 ve 22.07 | Odpovědět
Na komentář reagoval [11] Věroš Kaplan

#7 Petr http://melodie.na-mobil.cz nový

Š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

Posláno 22. 9. 2006 ve 21.53 | Odpovědět
avatar

#8 dusoft http://www.ambience.sk nový

Pozor: Firefox zjavne varuje pred presmerovanim cez 307 pri pouziti POST a pyta sa uzivatela, ci chce presmerovat aj odoslane udaje z formulara.

Posláno 23. 9. 2006 ve 13.21 | Odpovědět
avatar

#9 Ondra http://oslamecka.wz.cz nový

Zajimave a určite se hodi.

Posláno 23. 9. 2006 v 18.06 | Odpovědět
avatar

#10 Non_E nový

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.

Posláno 23. 9. 2006 ve 22.55 | Odpovědět

#11 Věroš Kaplan http://www.cestovatel.cz/~2/ nový

#6 David Grudl: 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).

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 :-)

Posláno 25. 9. 2006 v 9.17 | Odpovědět
avatar

#12 Šimon Grimmich http://www.tvorba-webu.cz/ nový

Díky za stručný seznam, 3XX cifry mi též dělají potíže

Posláno 26. 9. 2006 ve 13.16 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.