LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> php rewrite

Někdy se stane, že nemáme k dispozici na našem hostingu tzv. rewrite, nebo si jeho pravidla nemůžeme sami zpravovat (např. u lighttpd serveru). V jiných pokročilých webových programovacích jazycích je ale obvyklé, použít tabulku adres a handlerů na funkce, které takovou adresu (požadavek) obslouží.

13.11.2009 00:00 | Ondřej Tůma | Články autora | přečteno 12699×

Komerční sdělení: Pořádáme Kurzy PHP

404 - stránka (ne)nalezena

K tomu aby to všechno fungovalo, potřebujeme provozovat vlastní chybovou stránku pro obsluhu chyby 404 - tedy nenalezeno. To lze nastavit na serveru Apache i pomocí .htaccess souboru. Pokud máme tuto možnost zakázanou, je třeba kontaktovat administrátora serveru, a požádat ho o příslušné nastavení. Chybová stránka je pak volána pokaždé, když server nenalezne soubor odpovídající http požadavku. Před samotným hledáním samozřejmě server provádí řadu úkonů, mezi něž patří i provedení rewrite pravidel.

V případě že budeme veškeré řízení aplikace provádět přes tuto stránku, je třeba si uvědomit, že server automaticky vrací klientovi a loguje stav vyvolání stránky jako chybu 404, a je tedy takto vedena i ve statistikách generovaných právě z logu serveru. Aby k tomuto nedocházelo, je třeba server přesvědčit, v případě že požadavek je v pořádku) aby do logu a i klientovi vracel relevantní kód. Přesvědčit klienta je celkem snadné, je důležité co nejdříve zavolat příkaz header('HTTP/1.1 200 Ok'). V případě serveru Apache ovšem toto neovlivní kód který je logován, Teoreticky lze toto napravit funkcí http_send_status, toto ale nemám ověřené, navíc nejde o standardní funkci php, ale o funkci z PECL rozšíření.

dispatch table

A nyní co by měl dělat kód uložený v chybové stránce. Takový kód musí sám rozeznat http požadavek, resp. zadané url, a na základě vyhodnocení tohoto požadavku spustit příslušný kód. Toto v podstatě dělá i webový server, ten pokud ovšem nedokáže obsloužit takový požadavek, vrátí uživateli chybovou stránku, resp. pustí kód, který jí má vygenerovat. Naše chybová stránka, která duplikuje takové chování po svém pak může vypadat nějak takto:

<*php preg_match("([\w\/]*)",$_SERVER["REQUEST_URI"], $matches); $uri = $matches[0]; switch($uri){ case "/info": phpinfo(); break; case "/globals": header ('HTTP/1.1 200 Ok'); echo "<h1>PHP rewriter test to globals</h1>"; echo ""; foreach ($GLOBALS as $key => $val) echo ""; echo "
$key:$val
"; break; default: // header je zde teoreticky uplne zbytecny header('HTTP/1.1 404 not found'); echo "<h1>404 not found</h1>"; echo "Your request `$uri` is not handled!"; } php>

Tento kód nejprve pomocí regulárního výrazu získá konec zadané adresy, která vyvolá chybu 404. Následuje jednoduchý switch, který pro konkrétní požadavek spustí konkrétní kód. Výchozí default větev vrátí chybovou stránku s chybovým stavem 404, tedy opravdu nenalezeno :) Tento kód slouží pro ukázku a je tedy velmi jednoduchý. Regulární výraz použitý pro získání požadavku se dá rozhodně pořádně vylepšit a ani hlavička s návratovým kódem není použita všude kde by měla, a už rozhodně ne pořádně.

Kód by mohl být vylepšen o celou řadu dalších programátorských technik, rozhodně by to mohlo být volání funkcí místo spouštění kódu. Kolem celého mechanismu by měla být vytvořena řada nějakých podpůrných funkcí právě ke správnému a jednotnému ošetření hlaviček, výstupu atd.

php rewrite

Pomocí fíglu s odchycením chyby serveru 404 lze vytvořit v php i "opravdový" mod_rewrite, budeme mu říkat php_rewrite ;) Kód by měl v podstatě získat adresu požadavku, a na základě nějakých pravidel přesměrovat na správný požadavek, který již bude obsloužen (tak jak to dělá webový server). Jedno z kouzel mod_rewrite ale je, že se v prohlížeči návštěvníka stránky adresa nezmění, i toho lze malým trikem dosáhnout, musíme ale opravdu vědět, co vlastně děláme. Následující kód přidává php_rewrite do CMS Morias, tedy již do hotového projektu.

<*php preg_match("([\w\/]*)",$_SERVER["REQUEST_URI"], $matches); $uri = $matches[0]; function rwrule($pattern, $target){ global $uri; $new_url = preg_replace('/'.$pattern.'/', $target, $uri); // z vyslende url, nakrmime superglobalni promenou _GET, ta neni vsupem // z prohlizece, proto ji musime vytvorit umele preg_match_all('(\w+=\w+)', $new_url, $query); foreach ($query[0] as $pair){ list($var,$val) = explode('=', $pair); $_GET[$var]=$val; } return $new_url; } $new_url = rwrule("^\/text\/([a-zA-Z0-9\\-_]*)$","/?module=morias_text&action=texts&seo=$1"); // tyto dva prikazy zpusobi bezne presmerovani //header ('HTTP/1.1 301 Temorary move'); //header ("Location: $new_url"); header ('HTTP/1.1 200 Ok'); require_once('./index.php'); php>

Co to vlastně dělá? Funkce rwrule dostane dva parametry, regulární výraz, který je použit na url a cíl regulárního výrazu, tedy stránku, která se má opravdu načíst. V kódu je trochu zmatek, aktuální verze ve skutečnosti nepošle prohlížeči požadavek na přesměrování, ale z nového url získaného rewrite pravidlem pomocí regulárního výrazu naplní super-globální proměnou _GET a přímo načte php soubor, který tento požadavek dál zpracuje, jako by to byl normální http požadavek.

Díky tomu, že nedojde k přesměrování, ale k podsunutí _GET hodnot jinému php scriptu, uživatel bude mít ve svém prohlížeči původní adresu, a php_rewrite tak začne fungovat tak jak je mod_rewrite často používán.

Závěrem

Oba příklady jsem zkoušel na serveru lighttpd, který právě trpí nedostatkem, kdy si uživatel sám nemůže upravovat rewrite pravidla, pokud nemá přístup přímo ke konfiguraci serveru. Otázka jak moc je, nebo není vhodné, takto rewrite řešit nechám na laskavém čtenáři, či diskutujícím. Kdo se ale do této magie pustí, měl by pamatovat na záludnosti regulárních výrazů, ty bude třeba určitě pořádně vyladit, aby obsloužily správně všechny adresy.

Verze pro tisk

pridej.cz

 

DISKUZE

.htaccess 13.11.2009 11:42 Radim Kolář
  L Re: .htaccess 18.11.2009 21:05 Ondřej Čečák
    L Re: .htaccess 18.11.2009 23:32 Aleš Hakl
      L Re: .htaccess 19.11.2009 08:58 Ondřej Tůma
        L Re: .htaccess 20.11.2009 01:33 Aleš Hakl




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

24.3.2017 11:54 / Hui
country cottages

16.3.2017 16:33 / BezvaDesign.cz
Re: Hledám grafika do teamu

9.3.2017 11:44 / Jaromir Obr
Re: chyba

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze