Mod rewrite magyarázatok

apacheA legnagyobb aktivitás a blogon a rövid url-ekkel foglalkozó bejegyzésnél van. Sok kérdés összegyűlt és úgy láttam, hogy érdemes lenne pár kiegészítést és választ kiemelni egy külön bejegyzésként. Szeretném még itt az elején leszögezni, hogy nem vagyok egy mod_rewrite szakértő, csak épp annyira foglalkozok vele amennyire muszáj. Ennek a leírásnak a célja inkább az, hogy a korábbi bejegyzés pár gondolatát magyarázza, illetve, hogy az egész modul fő elvét bemutassa.

Mi a mod_rewrite?

A mod_rewrite arra szolgál, hogy a userek felé szép, egyszerűen megjegyezhető vagy éppen beszédes url-eket tudjunk prezentálni. Például a http://krisnavolgy.hu/index.php?p=7 és a http://krisnavolgy.hu/bucsu2009/ link ugyanazt az oldalt hozza be. A kettő közül azonban a második szebben néz ki, könnyebben olvasható, megjegyezhető. SEO szempontból is van némi különbség, de ennek részletei túlmutatnak ezen e bejegyzésen. Az, hogy a két link ugyanazt az eredményt adja a mod_rewrite-nak köszönhető.

Mi történik a háttérben?

Amikor egy kérés érkezik a webszerverhez – mondjuk mert Pistike bepötyögött egy címet a böngészőbe – akkor a webszerver megpróbálja az url-t lefordítani a szerveren található elérési úttá. Mondjuk ha beírjuk, hogy http://webmania.cc/rrd, akkor a webszerver először is leválasztja az url-ről a domain részt, azaz esetünkben a webmania.cc-t. A konfigurációs beállítások szerint megkeresi a szerveren az ehhez a domainhez tartozó webes fájlok gyökerét, ami mondjuk a /home/webmaniacc/public_html könyvtár lesz.

A következő próbálkozás alapesetben az lesz, hogy megnézi, hogy ebben a könyvtárban van-e rrd nevezetű fájl vagy könyvtár. Ha van akkor megjeleníti azt, ha nincs akkor 404-es hibát dob.

Nekünk persze nincs rrd nevezetű fájlunk vagy könyvtárunk, hanem azt szeretnénk, hogy ha valaki ezt az url-t hívja meg akkor azt irányítsa át egy bizonyos másik fájl-ra.

A hogyan

Az ehhez szükséges eszköz apache webszerver esetén a mod_rewrite modul. A modul segítségével az említett gyökér könyvtárban elhelyezhetünk egy .htaccees nevű állományt amibe beleírhatjuk az url átírási szabályokat.

A mod_rewrite-ot sokszor átirányításnak fordítják ami kissé félrevezető. Vannak tényleges átirányításra használható flag-ek, de amit valójában a mod_rewrite csinál az az, hogy a beérkezett url-t átírja valami másra.

Ha kedvünk tartja akkor akár több száz átirányítási szabályt is definiálhatunk a .htaccess fájlban. Általában azonban nem ezt fogjuk tenni, mivel ennek fenntartása éléggé nehézkes és meglehetősen rugalmatlan. E helyett döntő többségben azt fogjuk tenni, illetve az ismert keretrendszerek és tartalomkezelők azt teszik, hogy először megvizsgálják, hogy a lekért url létező fájlra / könyvtárra mutat-e. Ha igen, akkor kiszolgálják. Minden nem létező pontra mutató hivatkozást pedig egyetlen egy helyre – mondjuk az index.php-ra – irányítanak, úgy hogy paraméterként hozzáadják a lekért url-t. Ezzel azt érik el, hogy az url-ek kezelését automatizálni tudják, egy rugalmas és hordozható módon kezelhetővé.

Egy tipikus átirányítási szabály ezért valahogy így fog kinézni:

#ha nemlétező file
RewriteCond %{REQUEST_FILENAME} !-f
#ha nemlétező könyvtár
RewriteCond %{REQUEST_FILENAME} !-d
#akkor legyen átirányítás
RewriteRule ^(.*)$ index.php?url=$1 [QSA]

Ennek a részletes magyarázatába szintén nem mennék bele aki akarja, az megtalálja a fent emlegetett url átírásról szóló bejegyzésben.

Összefoglalva többnyire a .htaccess oldaláról elég egyszerűen kezelhető az url átírása és inkább érdemes a szerver oldalon futó programra bízni a paraméterek feldolgozását.

Leggyakoribb problémák

Nem fut a modul
A mod_rewrite nem feltétlenül fut, főleg nem ingyenes tárhelyszolgáltatónál, illetve a .htaccess használata sem feltétlenül engedélyezett. Ezek tesztelése nagyon egyszerű. A .htaccess fájlba be kell írni valami értelmetlen szöveget (asdf). Ennek hibát kell eredményeznie, többnyire 500-as Internal Server Error-t. Ennek javításához a szerver üzemeltetővel kell alkudozni.
Reguláris kifejezés
A mod_rewrite reguláris kifejezéseket tesztel. Sokszor maga a reguláris kifejezés nem stimmel és ezért nem működik az url átírás. A reguláris kifejezések tesztelhetők sok online eszközzel, például ezzel.

Remélem ezzel a kis kiegészítéssel már mindenki könyebben át tudja vergődni magát az első saját mod_rewrite-os tűzkeresztségen. 🙂

3 thoughts on “Mod rewrite magyarázatok

  1. Meglehetősen offtopic, de ha már itt járok gondoltam felvetem ezt a problémát, hátha van valami jó ötleted:

    A Drupal keretrendszer is pont ezt csinálja amit mondasz, az index.php?q=URL címre írja át minden kérést. Viszont nekem használnom kell egy beépíthető JS scriptet, ami megjelenít egy form-ot és ugyanarra az oldalra mutat a form action. GET-en keresztül adja át saját magának az adatokat, és közöttük használja a “q” paramétert is.

    Tehát felülírja a Drupal által is használt “q” paramétert. A külső JS scripthez nincs hozzáférésem, csak használni tudom. A Drupal forráshoz van, de csak a core átírásával tudom feloldani az ütközést, plussz vannak modulok (bár ritka) amelyik közvetlenül a $_GET[‘q’] változót olvassa, ami miatt szintén bukik a dolog.

    Van ötleted hogy lehetne feloldani a problémát?

    • @EdgarPE azaz a q-t két különböző dologra használja? Nem egészséges. Ha van valmi ami eltér a kettő között, pl a js a q mellé kitesz mást is akkor át lehet írni a rewrite-ot, hogy figyelje a másik változó létét is. Jobb híján.

  2. Erről jut eszembe egy problémám.
    Ékezetes domain-t szeretnék átírni ékezet nélkülire, de az aldomain megtartásával.
    Pl. blabla.xn--tvm-bmab.hu/blublu –> blabla.tevem.hu/blublu
    Ha van itt valaki aki kapásból tudja a megoldást, akkor szívesen veszem 🙂

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.