Na navigaci | Klávesové zkratky

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 #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 17 lety | reagoval [6] David Grudl
  2. 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 ?

    před 17 lety | reagoval [3] Tomáš [6] David Grudl
  3. Tomáš #3

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

    před 17 lety
  4. Filosof #4

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

    před 17 lety | reagoval [6] David Grudl
  5. felipe #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 17 lety | reagoval [6] David Grudl
  6. David Grudl #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 17 lety | reagoval [11] Věroš Kaplan
  7. 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

    před 17 lety
  8. dusoft #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 17 lety
  9. Ondra #9

    avatar

    Zajimave a určite se hodi.

    před 17 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 17 lety
  11. Věroš Kaplan #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 17 lety
  12. Šimon Grimmich #12

    avatar

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

    před 17 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

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