mod_rewrite

May 22, 2006

Har du nogen sinde set URLs på formen:
www.mypage.dk/index.php?user=Simon&page=gallery
Dette er sider genereret med et dynamisk sprog som f.eks. PHP (se evt. posten "Vil du også være med? Del. II"), der unikt peger på indhold, som var det på formen:
www.mypage.dk/Simon/gallery.html

Men har du nogen sinde lavet et community, med brugerprofiler og mulighed for flere forskellige funktionaliteter, som f.eks personligt galleri, vil du vide at dette er mere eller mindre umuligt at holde styr på med HTML alene.
Alligevel kan du på f.eks. www.deviantART.com, som nok er verdens største kreative community, se URLs som:
http://user.deviantart.com/gallery/
Her skulle man igen, ved første øjekast, tro at der fantes et katelogene /User/gallery/ med en index-fil af en eller anden slags. Men med sine over 2 millioner brugere og mere end 21 millioner uploads (til dags dato), tvivler jeg meget stærkt på at dette er tilfældet!
Mere sandsynligt er det, at sider på formen /User/gallery/ er blevet mappet over på formen /?user=User&page=gallery - Og det er faktisk muligt!

Måden dette kan håndteres er ved hjælp af et såkaldt re-write modul, som er installeret på webserveren.
Da jeg selv benytter Apache´s webserver, og det er denne jeg har erfaring med, vil det blive denne jeg tager fat på.
Til Apache hedder modulet mod_rewrite, og følger med installationen som standard (til Windows i hvert fald).

mod_rewrite modulet fungerer ved at undersøge den URL der bliver sendt, og teste den op mod nogle rewrite regler.
Reglerne kan defineres i serverens konfigurations fil httpd.conf, eller hvis man ikke har adgang til denne, via en .htaccess-fil. Reglerne defineres vha. regulære udtryk, hvilket nemt kan virke som en gang hyroglyfer ved første møde.
Lad os springe ud i det. Tager vi overstående eksempel fra deviantART, vil målet her være at lave en regel, der mapper:
    /User/gallery
over i:
    /?user=User&page=gallery

Og dette kan vi gøre ved reglen:

RewriteEngine On
RewriteRule ^([a-z] )/([a-z] )/? index.php?user=$1&page=$2 [L]


Skridt for skridt:
- Først lader vi serveren vide at RewriteEngine, som er motoren bag hele modulet, skal være slået til.
- Herefter laver vi regel, der genkender URLs som består af to strenge, med et eller flere af karakterene [a-z] , efterfulgt af en eller ingen slash (/?).
- For hver streng, som er defineret meller paranteserne, substituerer vi disse over i variablen $1, $2, som er værdier for henholdvis user og page.

Og så er vi faktisk kørende. Du kan nu tilgå siden /?user=User&page=gallery med URLen /User/galley. Du skal dog være opmærksom på, at der ikke er nogen magi her, du skal selv i din kode omskrive dine URLs til at benytte den nye struktur, og blot hold for øjet, at de jo faktisk er på den mere forvirende form.

Men hvor skulle ham overhovedet ville gøre dette? Tja - hvad husker du bedst?
/?year=2006&month=May&day=22&id=21
eller
/22-May-2006/mod_rewrite.html
Og det gør søgemaskiner desuden også!

Før jeg skrev denne artikel, var jeg forbi følgende tre sider, som indeholder nogle noget mere detajlerede beskrivelser om både mod_rewrite og regulære udtryk. Er du mere interesseret, er de rigtig gode startsteder:
www.alistapart.com/articles/urls/
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
http://forum.modrewrite.com/

Comments

comments powered by Disqus