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

vytrženo z kontextu

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.

Karma body: 39. Líbil se vám článek?

Komentáře » přidat

  1. avatar [1] error414: 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. [2] Tomáš: 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áš
    Na komentář reagoval [6] David Grudl
  3. [3] Tomáš: 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. [4] Filosof: 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
  5. avatar [5] felipe: 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
  6. avatar [6] David Grudl: 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. [7] Petr: 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
  8. avatar [8] dusoft: 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
  9. avatar [9] Ondra: nový

    Zajimave a určite se hodi.

    Posláno 23. 9. 2006 v 18.06 | Odpovědět
  10. 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. [11] Věroš Kaplan: 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
  12. avatar [12] Šimon Grimmich: 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 ani hlasovat

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á.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

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