Na navigaci | Klávesové zkratky

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

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

    avatar

    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.

    před 10 lety | reagoval [6] David Grudl
  2. Tomáš http://www.quax.cz #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 :-)

    před 10 lety | reagoval [3] Tomáš [6] David Grudl
  3. Tomáš http://www.quax.cz #3

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

    před 10 lety
  4. Filosof http://blog.filosof.biz/ #4

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

    před 10 lety | reagoval [6] David Grudl
  5. felipe http://felipe.ic.cz #5

    avatar

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

    před 10 lety | reagoval [6] David Grudl
  6. David Grudl http://davidgrudl.com #6

    avatar

    #1 error414, je to právě proto, aby se další kód neprováděl

    #2 Tomáši, 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 Filosofe, 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 ' -->';
    před 10 lety | reagoval [11] Věroš Kaplan
  7. Petr http://melodie.na-mobil.cz #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

    před 10 lety
  8. dusoft http://www.ambience.sk #8

    avatar

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

    před 10 lety
  9. Ondra http://oslamecka.wz.cz #9

    avatar

    Zajimave a určite se hodi.

    před 10 lety
  10. Non_E #10

    avatar

    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.

    před 10 lety
  11. Věroš Kaplan http://www.cestovatel.cz/~2/ #11

    #6 Davide Grudle, 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 :-)

    před 10 lety
  12. Šimon Grimmich http://www.tvorba-webu.cz/ #12

    avatar

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

    před 10 lety

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