Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

13. 3. 2012 Ostatní PHP

Redirect direktivy a mod_rewrite

S nástupem frameworků se stalo trendem používání různých způsobů "routingu" neboli nasměrování určité url na konkrétní třídu (controller), který se stará o odbavení a ve výsledku i zobrazení stránky na daném url. Dříve se na podobné činnosti používal zejména Apache modul mod_rewrite a jeho přepisovací pravidla. Ten se sice ještě stále používá, ale v drtivě většině na to, že nasměrujeme "všechno" do naší php aplikace, která se již postará o zbytek. Proto mě poměrně zásadně nedávno potrápilo použití mod_rewrite společně s mod_alias pro přesměrování.

Naprosto zásadní věcí totiž je, že o přesměrování zapsané v Apache přes direktivy Redirect a spol. se stará nikoli mod_rewrite, ale mod_alias, a to tak, že veškeré tyto přesměrování se zpracovávají až po přepisovacích pravidlech z mod_rewrite.

Předpokládejme zhruba tuto konfiguraci:

RewriteEngine On

# framework
RewriteRule ..... /index.php [L]

Za pravidlem se skrývá cokoli, nejčastěji množina pravidel, na tom nezáleží. Jde o to, že někde v php kódu, který se skrývá hluboko za index.php máme něco, co přesměrovává url /static.xml někam na náš rychlý server se statickým obsahem - http://files.domain.net/static.xml.

A teď se z neznámého důvodu rozhodneme optimalizovat výkon a zrychlit přístup k tomuto souboru tak, že přesměrování uděláme přímo v Apache a protože když už optimalizujme, tak pořádně, proto použijeme raději mod_alias a Redirect direktivy, která přeci musí zajistit rychlejší odbavení redirektu než přepisovací záležitosti mod_rewrite. Takže přidáme do konfigurace řádek

RedirectPermanent /static.xml http://files.domain.net/static.xml
RewriteEngine On

# framework
RewriteRule ..... /index.php [L]

v domnění, že se nám ten redirect krásně uplatní před přepisováním. Ale ono smůla. Musíme do přepisovacích pravidel přidat vynechání static.xml z přepisovacích pravidel, protože - jak bylo uvedeno výše - má přepisování z mod_rewrite přednost před přesměrováním z mod_alias.

RewriteEngine On

# framework
RewriteRule !/static.xml ...... /index.php [L]

RedirectPermanent /static.xml http://files.domain.net/static.xml

Jaký je závěr? Nejraději se na celý proces optimalizace vykašlat a nechat toho co nejvíce na aplikaci, protože je to jasné duplikování, které může dělat jen potíže. To, co dělá mod_alias s redirektem, dělá i mod_rewrite a také i naše aplikace. Pokud to bude v aplikaci, bude to sice pomalejší, ale to zejména u permanentních redirektů, kterých je většina, to nějak zásadně nevadí. Vyvážené to bude lepší udržovatelností a možnostmi ladění, které jsou u aplikace lepší než ladit redirekty v konfiguraci Apache. Když už něco chtít přesouvat do Apache, tak raději Redirect direktivy z mod_alias vůbec nepoužívat a vše udělat v mod_rewrite direktivách.


Komentáře (0)

Komentáře jsou uzavřeny.