Mod_rewrite pro hezká URL – RewriteEngine a RewriteRule

15. července 2005

Mod_rewrite zažívá v dnešní SEO době velký boom, a přitom na českém internetu stále chybí ucelený pohled na tuto problematiku. V následující sérii článků se pokusím do tajů přepisování URL proniknout co nejhlouběji a poskytnout vám podrobného průvodce, který vám ozřejmí smysl, principy i praktické použití mod_rewrite.

Co to je mod_rewrite

Pojďme si nejdříve nasadit brýle začátečníka, který má z tohoto slova s podtržítkem ještě respekt. Takzvaný mod_rewrite je modul Apache, který se poprvé objevil v tomto serveru už ve verzi 1.2, tudíž je skoro zaručeno, že i váš webhosting si s mod_rewrite poradí.

Systém mod_rewrite má zcela zásadní význam pro Search Engine Optimization (SEO), protože se každý snaží dostat do URL co nejvíce důležitých klíčových slov a také je zpřehlednit pro návštěvníka webu. Podstata mod_rewrite tkví ve vymyšlených souborech, či adresářích, které na serveru fyzicky neexistují a přitom „normálně“ fungují, protože server podstrčí uživateli existující, většinou dynamický soubor.

Jednoduše řečeno – musíte určit, za jakých okolností se přesměrování provede a na jaký existující soubor bude směřovat.

Jde to i jinak?

Ovšem, pro jednoduché přesměrování se dá použít i metahlavička v XHTML či funkce header() v PHP, ale při jejich použití narazíte na zásadní problém – můžete přesměrovávat jen na existující soubory a URL navíc musí mít stále stejný tvar typu index.php?id_clanku=5.

Pokud přesměrujete na neexistující soubor, většinou se zobrazí stránka chyby 404 – Document not found. Moderní webhostingy však již umožňují modifikaci těchto chybových stránek a jejich využití k přesměrování na korektní soubory. (Blíže viz článek Vlastní přesměrovací služba, či novější Nečekaný potenciál chybové 404 stránky. Takto dosáhnete skoro stejného efektu jako s mod_rewrite, jen se uživateli mění URL pod nosem, což není zcela ideální a také to nepůsobí tím správným dojmem.

Server Apache umožňuje i další řešení, spočívající v takzvaném FilesMatch (blíže viz .htaccess a FilesMatch pro SEO URL). Potenciální nevýhoda je zde jasná – co se vlastně stane, musíte řešit až přímo ve skriptovacím jazyce, a tak si zbytečně znepřehledňujete kód.

Poslední řešení mimo mod_rewrite, o kterém se zmíním, je jeho bratrský mod_alias, viz například článek Na přesměrování je mod_alias. V podstatě je mod_alias hodně podobný mod_rewrite, jen je o něco rychlejší a neumožňuje toho tolik, co jeho složitější kolega. Za dalšího brášku by se dal pokládat i mod _redirect – oba se dají použít pro jednoduchá přesměrování.

Kdy použít mod_rewrite

Jak už jsem naznačil, největší uplatnění má při SEO, kdy z dlouhých, škaredých, dynamických URL vytvoříte výstižné, snadno zapamatovatelné adresy, nazývané též Cool URIs. Skoro se mi chce říci, že se fantazii meze nekladou. Se změnou koncovek z *.php na *.html můžete například vytvořit skvělou iluzi statického webu.

Jak sami uvidíte, používání mod_rewrite je velmi jednoduché, ovšem začátečníci mají problém s pochopením jedné věci, kterou jsem ještě přímo neobjasnil. Systém mod_rewrite za vás nepřevede odkazy na webu do oné vysněné podoby, to už musíte obstarat sami. Proto, když budete tvořit web, je dobré si už na začátku ujasnit, jaké Cool URIs budete používat, a svých zásad se držet (viz též SEO – struktura a přesměrování). Také je dobré si vytvořit funkce, které vám na základě předaných parametrů hezká URL vygenerují a vy je dynamicky v kódu vypíšete.

Co potřebuji k mod_rewrite

Jak jsem již zmínil, mod_rewrite je výsadou Apache od verze 1.2, takže v drtivé většině případů použijete také PHP. Modul mod_rewrite je standardní součástí serveru, jen ho musíte nahrát a povolit přepisování. Komplexnější informace o instalaci „svaté trojice“, včetně mod_rewrite, naleznete například v článku Jak na Apache (s mod_rewrite), PHP4 (s iconv), a MySQL pod Windows?.

Pro aktivaci mod_rewrite je důležité při startu Apache nahrát příslušný modul. Provedete to většinou odkomentováním tohoto příkazu v souboru httpd.conf:

LoadModule rewrite_module modules/mod_rewrite.so

Jednotlivá pravidla se zapisují do magického souboru .htaccess, který asi znáte z jiných techtle mechtlí – třeba ochrany souborů heslem, zakazování přístupů, modifikace chybových stránek a podobně.

K opravdu pružnému využití mod_rewrite je potřeba i znalost regulárních výrazů. Ano, bohužel, bez nich to nejde. V obávanosti u začátečníků totiž regulární výrazy nad mod_rewrite jasně vedou, ale snad vás mohu trochu uklidnit – k základnímu ovládání si vystačíme i s jejich nulovou znalostí. Pokud však chcete regulární výrazy plně ovládnout, přečtěte si seriál Perl-compatible regulární výrazy v PHP.

Mod_rewrite prakticky

Na úvod si dáme velice jednoduchý příklad z praxe. Generujete například nějaký XML výstup z PHP, ale nelíbí se vám koncovka? Horsta můžete nechat doma a peněženku zavřenou, protože stačí napsat jen dva řádky. Otevřete tedy .htaccess, uložte jej přímo do kořenového adresáře webu (rootu) a zapište do něj:

RewriteEngine On
RewriteRule ^rss.xml$ %{DOCUMENT_ROOT}/php/rss.php [L]

Jak jednoduché, že? První řádek je zcela nevyhnutelný – RewriteEngine On zapíná mod_rewrite. Stejně tak ho lze jednoduše vypnout – RewriteEngine Off, pokud chcete deaktivovat celé přepisování URL.

A toto je ta hybná část, aneb pravidlo, kdy se má přesměrování provést:

RewriteRule   co přesměrovat   kam přesměrovat   [příznaky]

Jak vidíte, syntaxe není vůbec složitá, jen je potřeba nadefinovat, kdy a kam se přesměrování provede. Do hranatých závorek se pak přidávají další parametry, které si postupně vysvětlíme.

Nejdříve tedy určíme, kdy se přesměrování provede. K tomu budeme potřebovat jednoduchý regulární výraz ^rss.xml$, který odpovídá pouze a jedině URL rss.xml v rootu webu. Znak ^ znamená začátek a $ konec regulárního výrazu. Všimněte si „escapování“ tečky pomocí zpětného lomítka. Tečka totiž znamená v regulárních výrazech jakýkoli znak, a tak by nám potom výrazu ^rss.xml$ odpovídal i řetězec rssoxml nebo rss9xml a podobné.

Následuje URL, na které se přesměruje. Všimněte si proměnné %{DOCUMENT_ROOT}, kterou můžeme spolu s dalšími (ukážeme si je později) používat takřka kdekoli v .htaccess. Tuto proměnnou můžeme i vypustit a zadávat adresu jen relativně. Osobně to však nedoporučuji, protože u některých hostingů to nemusí fungovat. Lze použít i absolutní adresu, ale okrádáte se o nutnost přepisovat .htaccess při použití na jiné doméně. Funkční může být také použít nastavení do rootu pomocí jednoho lomítka na začátku. Je víceméně jen na vás, jak adresy budete zadávat, osobně ale doporučuji přidat proměnnou %{DOCUMENT_ROOT}.

Do hranatých závorek se pak uzavírají další příkazy. V tomto případě jsme použili L (Last rule), což znamená, že je toto pravidlo konečné. Jak asi tušíte, pravidel může být více, a dokonce je můžeme mezi sebou křížit a kombinovat, jednoduše je oddělíme čárkami. Tento příznak je docela užitečný, protože někdy může jedna URL vyhovět více pravidlům, a za pomoci L se dají vytvořit priority.

Přesměrování statických souborů na dynamické

Nyní si ukážeme, jak vytvořit iluzi statického webu. Budeme tedy všude používat URL s *.html na konci a zbavíme se ošklivě vyhlížejících dynamických adres typu /index.php?stranka=nasefirma (budeme používat /nasefirma.html).

Podívejte se nejdříve na příklad:

RewriteEngine On
RewriteRule ^(.*).html$ %{DOCUMENT_ROOT}/index.php?stranka=$1 [L,QSA]

Regulární výraz už vypadá přeci jen trochu složitěji, než v předchozím příkladu. Tento odpovídá cokoli.html, jinak řečeno, každému řetězci s koncovkou .html. Část řetězce před .html jsme uzávorkovali, abychom mohli zjistit, co uživatel zadal, a použít to v následující části pravidla. Přesměrujeme totiž na dynamickou adresu index.php, které předáme proměnnou stranka, která bude obsahovat onen uzávorkovaný řetězec. Zpětných referencí (uzávorkovaných částí regulárního výrazu) se dá použít samozřejmě více, pak se na ně odkazujeme v pořadí, v jakém byly použity, tedy $1 odpovídá první závorce, $2 druhé a tak dále.

Přibyl nám také další parametr – QSA (Query String Append). Představte si, že chcete předat v URL nějakou další proměnnou, například /nasefirma.html?oddeleni=managment. Pokud byste nepoužili parametr QSA, proměnná oddeleni by se vůbec skriptu nepředala. S parametrem QSA se budou cílovému skriptu předávat další použité proměnné ve fiktivní URL automaticky.

Odkazy a zdroje

Oficiální dokumentace

Související články

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *