Mod_rewrite pro lepší odkazy
Lukáš Oborský, vydáno/aktualizováno: 21.7.2003/02.08.2003
V tomto článku se dozvíte, co je to mod_rewrite a jak pomocí něj můžete vylepšit odkazy na vaší webové stránce tak, aby byly srozumitelnější pro návštěvníky a vstřícnější k vyhledavačům.
Jedním z nejpoužívanějších webových serverů je Apache. Je napsán s důrazem na otevřenost, což umožňuje přidávat rozšiřující funkce neboli krátce moduly. Modulů pro Apache je celá řada, nás však dnes bude zajímat pouze jediný - mod_rewrite. Umí jen jednu věc, ale zato geniálně - překládat adresy. Číhá na serveru na každou požadovanou stránku, zkontroluje její adresu podle seznamu svých pravidel a pokud požadovaná adresa v seznamu je, aplikuje na ni konkrétní přepisovací pravidlo.
Proč používat mod_rewrite
Než vám povím, jak se mod_rewrite aktivuje a konfiguruje, krátce zmíním, s jakými typickými problémy vám může pomoci.
- Vaše stránky se přesunuly na nové adresy a vy na ně chcete návštěvníky přesměrovat.
- Vaše stránky mají příliš složité adresy. Nelze si je zapamatovat, špatně se posílají emailem, nevyjadřují obsah stránky, ani strukturu webu.
- Dynamické stránky obsahují v adresách parametry a vyhledavače je neochotně indexují.
- Chcete, aby adresy stránek byly nezávislé na použité technologii a potřebujete se tedy zbavit koncovek html, php, apod.
Praktický příklad použití mod_rewrite
Konkrétní příklad je desetkrát lepší než obecné povídání. Proto vám ukážu, jak jsem dva typické problémy řešil pomocí mod_rewrite přímo na našem weblogu Letem světem.
Jak mod_rewrite aktivovat
Nejprve si ale musíme ukázat, jak se podpora mod_rewrite vůbec zapíná. V příslušném adresáři, pro který se mají pravidla uplatňovat, vytvořte soubor .htaccess a do něj vložte následující řádku:
RewriteEngine on
Od té chvíle bude pro daný adresář mod_rewrite aktivní. Zatím ale nic nedělá, protože ještě nejsou vytvořena žádná pravidla. Nuže pojďme se podívat, jaké problémy vyřešíme.
Přesun stránek do domény třetího řádu
Prvním problémem weblogu byla zdvojená adresa. Původně weblog sídlil na adrese www.oborsky.cz/weblog, ale později jsem z adresáře weblog udělal doménu třetí úrovně, takže nová adresa je weblog.oborsky.cz. Jak jsem ale zjistil ze statistik, přes novou adresu stále chodilo méně lidí než přes starou. To by ani tak nevadilo, protože obě byly funkční, ale Google trpěl schizofrenií a rozděloval svůj PageRank mezi obě přístupové cesty.
Po pár dnech přemýšlení mne napadlo, že nejlepší by bylo na staré adrese vracet návratový kód HTTP 301, který signalizuje trvale přesunuté stránky a zároveň automaticky přesměruje na novou adresu. Tomu rozumí i Google a měl by oba PageRanky sečíst. Jak ale podstrčit kód 301 v případě přístupu přes starou adresu, když vše leželo stále v jednom adresáři? Snadno, vložíme-li do .htaccess následující dvě řádky:
RewriteCond %{HTTP_HOST} ^www\.oborsky\.cz RewriteRule ^index\.php$ http://weblog.oborsky.cz/index.php [L,R=301,QSA]
Co ty dvě řádky znamenají? První, RewriteCond
, určuje, za jakých podmínek se má pravidlo aplikovat. V tomto případě soubor .htaccess leží v adresáři weblog a proto se použije pouze v případě, že do tohoto adresáře míří požadavek návštěvníka. Prvním řádkem určíme, že následující pravidlo se použije pouze, když adresa bude začínat www.oborsky.cz. Půjdeme-li na weblog novou cestou, přes weblog.oborsky.cz, pravidlo se neaplikuje.
Obsahem druhého řádku je samotné pravidlo přepisu adresy. První část obsahuje standardní vstupní stránku weblogu, index.php. Pro zápis je použito regulárních výrazů, pokud s nimi nejste úplní kamarádi, nastudujte patřičnou literaturu (např. Regulární výrazy v příkladech od Lukáše Zapletala na Root.cz). Druhá část pravidla obsahuje cílovou podobu adresy, v našem případě tu samou stránku zpřístupněnou přes novou adresu.
Následují parametry pravidla v hranatých závorkách. L
znamená, že pravidla nehodláme řetězit, R
indikuje fyzické přesměrování včetně příslušného návratového kódu HTTP. Skupina QSA
pak říká, že případné předávané proměnné (tedy vše za otazníkem v adrese stránky) mají být do cílové adresy vloženy taky. Vyzkoušíme, prima, funguje to.
Jak udělat z dynamické adresy statickou
Druhý problém, který jsem řešil, byl snažší. Nelíbily se mi totiž adresy jednotlivých spotů weblogu. Adresa vypadala např. takto:
http://weblog.oborsky.cz/index.php?p=1234567&c=1
Ukáži vám, jak pomocí jednoduchého pravidla mod_rewrite vytvoříte nové odkazy, které budou mít mnohem přívětivější podobu, třeba tuto:
http://weblog.oborsky.cz/spot1234567.html
Kromě toho, že je druhá adresa srozumitelnější a vyhledavače ji raději a častěji indexují, hovoří pro ni ještě jeden důvod. Weblog je nyní založen na PHP. Ale pokud někdy v budoucnu přejdu na jiný systém, třeba .NET, změní se adresa stránky na index.aspx a veškeré odkazy z jiných serverů přijdou vniveč. Pokud ale budu skutečnou adresu maskovat pod virtuální html stránku, odkazy budou fungovat vždy a všude.
Jak bude tedy pravidlo vypadat?
RewriteCond %{HTTP_HOST} ^weblog\.oborsky\.cz RewriteRule ^spot(.*)\.html$ http://weblog.oborsky.cz/index.php?p=$1&c=1 [L,QSA]
První řádek je vám už z předchozího případu jasný. Co říká ten druhý? Pokud někdo požaduje stránku na adrese začínající písmeny spot s koncovkou html, má se mu místo toho podstrčit adresa vedoucí na skutečný článek. Díky tomuto pravidlu nemusí stránky s příponou html vůbec existovat! Mod_rewrite totiž přemění adresu dřív, než Apache začne zjišťovat, zda stránka existuje.
Vidíme také, že z hranatých závorek vypadlo písmeno R
pro přesměrování. To způsobí, že místo klasického přesměrování se browseru pouze podsune obsah cílové stránky, aniž by se na ni skutečně přešlo. V adresním řádku prohlížeče proto nadále uvidíte spot1234567.html
.
Na dvou praktických příkladech jsem vám ukázal, k čemu můžete mod_rewrite použít. Samozřejmě není možné celou problematiku probrat na pár řádcích. Proto berte tento text spíše jako motivaci k dalšímu samostudiu. Pro začátek nabízím výborný dvojdílný seriál Což si tak trochu zapřepisovat? od Michala Krause, který vyšel před dvěma lety v Root.cz. Kupodivu se dodnes jiný článek v češtině k dané tématice neobjevil.
Přeji vám úspěšné bádání a hodně štěstí při přepisování. V případě jakýchkoliv dotazů k tématu mě můžete kontaktovat emailem nebo na ICQ 45441092. Viva mod_rewrite.
Odkazy
- Mod-rewrite v dokumentaci Apache 1.x
- Mod-rewrite v dokumentaci Apache 2.x
- Průvodce k přepisování URL
- Dokumentace souvisejícího modulu mod_alias
- Praktický návod na mod_rewrite od Dušana Janovského
- Přepisování URL pro Windows IIS (via Google)
Poznámky Sovy v síti
- V článku popsaný postup předpokládá, že máte na serveru k dispozici mod_rewrite možnost měnit nastavení Apache přes .htaccess. V případě sdíleného hostingu tomu tak být nemusí.
- V uvedeném postupu není ošetřen případ, kdy uživatel zadá URL bez úvodního www (tj. např. jen oborsky.cz).
O autorovi
Lukáš Oborský, alias Lukin, je zakladatelem a hlavním přispěvatelem weblogu Letem světem, ve kterém denně naleznete užitečné rady, odkazy a aktuality týkající se webdesignu a tvorby webových stránek.