Mod rewrite magyarázatok
apache, hogyan, mod-rewrite, url
A 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.
Ez a bejegyzés rrd billentyűzetéből potyogott ki 2009 április 25. napján 11:00:08-kor. Eddig 3,888 olvasást ért meg. A visszajelzéseket nyomonkövetheted ezzel az RSS feed-el. Véleményt nyilváníthatsz, vagy trackbackolhatsz a saját oldaladon.
JólMegMondjad!
3 vélemény
-
EdgarPE
2009 április 25. 15:03:29Meglehető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?
-
rrd
2009 április 25. 17:44:56@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.
-
bpelhos
2009 április 27. 15:35:22Errő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



