Mange sider har URLer som http://example.com/index.php?side=1294&cat=1&shizzle=32. Det er relativt lite brukarvenleg, og kor mange går rundt og hugsar slike URLer?
mod_rewrite er et svært kraftig vertkøy, som kan brukast for å gi enklare URLer.
Tenk deg at URLen ovanfor hadde blitt noko så enkelt som http://example.com/1/1294/32. Fortsatt ikkje heilt enkel å hugse, men definitivt mulig. Korleis kan ein få til dette?
Svaret er mod_rewrite[1]. Ved å lage ei .htaccess-fil i katalogen der du vil skrive om URLer, kan du oppnå dette. For å skrive om eksempelet ovanfor så kunne vi brukt følgande:
Forklaringa på den snutten kjem seinare, og innen den tid vil du antakeleg ha fått på plass basis-kunnskapen!
Enkel bruk av mod_rewrite
Syntax for mod_rewrite/RewriteRule:
Så et lite eksempel:
Her seier vi at http://example.com/topp skal peike til index.html. Dersom du besøker http://example.com/topp så vil du få opp index.html, men URLen som står i nettlesaren vil viser topp. mod_rewrite foregår serverside. Klienten veit ikkje at mod_rewrite er i bruk, og det fungerer derfor med alle nettlesere uavhengig av javascript og slikt.
Du kan legge til så mange peikarar som du vil til ei fil, og du kan ha så mange rewrite-rules du vil.
Men kva om du vil bruke litt meir dynamiske omskrivinger, slik som i første eksempelet? Der kjem bruken av () inn. () indikerer at det er en variabel, og mod_rewrite vil da ta vare på dei slik at du kan bruke dei seinare.
Steg for steg så seier den rewrite-regelen der følgande:
^ indikerer start på linja, altså det som kjem etter http://example.com/
$ indikerer slutt på linja. (Dette er regexp)
() indikerer at det inni parantesen skal takast ut og lagrast som en variabel.
[0-9]+ er eit regulært uttrykk, som godtar tall fra 0-9. +-tegnet etter [0-9] indikerer at det kan vere så mange forekomster av heiltal som det vil.
Med andre ord blir heiltal henta ut og lagra som $1.
$1 bruker vi så igjen når vi definerer kor en request etter den sida skal havne.
Så når du har lagt til den rewrite-regelen der og går til example.com/751, så vil webserveren skrive det om til example.com/index.php?side=751, og gi resultatet til deg.
Som du kanskje har skjønt utifra første eksempelet så kan du ha fleire variabler og hente dei igjen som $1, $2 osb.
Kva som blir henta ut blir bestemt av eit regulært uttrykk, regexp på engelsk. Regexp er eit eige emne i seg sjølv, og eg anbafelar deg å lære litt elementær regexp.
Bruk av mange ulike tekst-variabler.
Tenk deg at du driver en nettbutikk. Du har 3 varekategorier:
*Hovedkort
*RAM
*CPU
Nettbutikken din har URLer på forma http://example.com/butikk.php?kategori=1&vare=24
Du vil gjere desse meir brukarvenleg, og skriv følgande i .htaccess
Då vil folk kunne gå til http://example.com/butikk/hovedkort/23 t.d.
Imidlertid blir ting veldig klumsete den dagen du utvider, og begynner å selge kabinett, komplette pcer o.l.
Men mod_rewrite kjem til unsetning også her!
Tekstfila kategorier.txt kan då inneholde:
Med andre ord ei rimelig enkel tekstfil å velikeholde.
Då vil apache lese inn kategorier.txt, og bruke den til å mappe med, slik at http://example.com/butikk/kabinett vil gå til http://example.com/butikk.php?kategori=5
Då har vi sett på enkel bruk av mod_rewrite, der ting alltid blir likt, uavhengig av nettleser o.l.
Kondisjonell rewrite
Kondisjonell rewrite vil sei at en rewrite bare blir foretatt i gitte situasjoner, t.d avhengig av nettlesar o.l. Dette kan brukast dersom du har ei css-fil for opera og Firefox, og ei for Internet Explorer.
Følgande eksempel illustrerer det.
Då kan du bruke stilark.css som URL i alle nettsider, og mod_rewrite vil gi ut iestilark.css til Internet Explorer, og standard.css til alle andre nettlesarar.
Du kan også bruke mod_rewrite for å hindre andre i å "hotlinke" til dine bilder:
Her har vi i tillegg til kondisjonelle rewrites innført en ny ting: [R]. Det er en parameter som seier at mod_rewrite ikkje skal skrive om i all stillhet, men ber mod_rewrite sende 302 Document has Moved-headeren, som får nettlesaren til å besøke den sida som blir oppgitt, i dette tilfellet 404.html.
For komplett oversikt overk kondisjonelle rewrites, sjå heimesida til mod_rewrite.
[1]: Ikkje alle webhotell har mod_rewrite installert. Om ditt webhotell ikkje har mod_rewrite kan du sende e-post til levrandør og be dei installere det, eller bytte webhotell. Du kan ikkje installere det sjølv med mindre du har root på serveren.
mod_rewrite er et svært kraftig vertkøy, som kan brukast for å gi enklare URLer.
Tenk deg at URLen ovanfor hadde blitt noko så enkelt som http://example.com/1/1294/32. Fortsatt ikkje heilt enkel å hugse, men definitivt mulig. Korleis kan ein få til dette?
Svaret er mod_rewrite[1]. Ved å lage ei .htaccess-fil i katalogen der du vil skrive om URLer, kan du oppnå dette. For å skrive om eksempelet ovanfor så kunne vi brukt følgande:
Kode
RewriteEngine on RewriteRule ^([0-9]+)/([0-9]+)/([0-9]+)$ index.php?cat=$1&side=$2&shizzle=$3
Enkel bruk av mod_rewrite
Syntax for mod_rewrite/RewriteRule:
Kode
RewriteRule URL_som_skal_omskrivast URL_slik_den_faktisk_er_på_server [options]
Kode
RewriteEngine on RewriteRule ^topp$ index.html
Du kan legge til så mange peikarar som du vil til ei fil, og du kan ha så mange rewrite-rules du vil.
Men kva om du vil bruke litt meir dynamiske omskrivinger, slik som i første eksempelet? Der kjem bruken av () inn. () indikerer at det er en variabel, og mod_rewrite vil da ta vare på dei slik at du kan bruke dei seinare.
Kode
RewriteEngine on RewriteRule ^([0-9]+)$ index.php?side=$1
^ indikerer start på linja, altså det som kjem etter http://example.com/
$ indikerer slutt på linja. (Dette er regexp)
() indikerer at det inni parantesen skal takast ut og lagrast som en variabel.
[0-9]+ er eit regulært uttrykk, som godtar tall fra 0-9. +-tegnet etter [0-9] indikerer at det kan vere så mange forekomster av heiltal som det vil.
Med andre ord blir heiltal henta ut og lagra som $1.
$1 bruker vi så igjen når vi definerer kor en request etter den sida skal havne.
Så når du har lagt til den rewrite-regelen der og går til example.com/751, så vil webserveren skrive det om til example.com/index.php?side=751, og gi resultatet til deg.
Som du kanskje har skjønt utifra første eksempelet så kan du ha fleire variabler og hente dei igjen som $1, $2 osb.
Kva som blir henta ut blir bestemt av eit regulært uttrykk, regexp på engelsk. Regexp er eit eige emne i seg sjølv, og eg anbafelar deg å lære litt elementær regexp.
Bruk av mange ulike tekst-variabler.
Tenk deg at du driver en nettbutikk. Du har 3 varekategorier:
*Hovedkort
*RAM
*CPU
Nettbutikken din har URLer på forma http://example.com/butikk.php?kategori=1&vare=24
Du vil gjere desse meir brukarvenleg, og skriv følgande i .htaccess
Kode
RewriteEngine on RewriteRule ^butikk/hovedkort/([0-9]+) butikk.php?kategori=1&vare=$1 RewriteRule ^butikk/ram/([0-9]+) butikk.php?kategori=2&vare=$1 RewriteRule ^butikk/cpu/([0-9]+) butikk.php?kategori=3&vare=$1
Imidlertid blir ting veldig klumsete den dagen du utvider, og begynner å selge kabinett, komplette pcer o.l.
Men mod_rewrite kjem til unsetning også her!
Kode
RewriteMap kategorier txt:kategorier.txt RewriteRule ^butikk/(.*)/([0-9]+)$ butikk.php?kategori=${kategorier:$1}&vare=$2 RewriteRule ^butikk/(.*)$ butikk.php?kategori=${kategorier:$1|0}
Kode
hovedkort 1 ram 2 cpu 3 pcer 4 kabinett 5
Då vil apache lese inn kategorier.txt, og bruke den til å mappe med, slik at http://example.com/butikk/kabinett vil gå til http://example.com/butikk.php?kategori=5
Då har vi sett på enkel bruk av mod_rewrite, der ting alltid blir likt, uavhengig av nettleser o.l.
Kondisjonell rewrite
Kondisjonell rewrite vil sei at en rewrite bare blir foretatt i gitte situasjoner, t.d avhengig av nettlesar o.l. Dette kan brukast dersom du har ei css-fil for opera og Firefox, og ei for Internet Explorer.
Følgande eksempel illustrerer det.
Kode
RewriteCond %{HTTP_USER_AGENT} ^.*Internet Explorer.* RewriteRule ^stilark.css$ iestilark.css RewriteRule ^stilark.css$ standard.css
Du kan også bruke mod_rewrite for å hindre andre i å "hotlinke" til dine bilder:
Kode
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://example.com/.*$ RewriteRule .*\.(gif|png|jpg|jpeg)$ http://example.com/404.html [R]
For komplett oversikt overk kondisjonelle rewrites, sjå heimesida til mod_rewrite.
[1]: Ikkje alle webhotell har mod_rewrite installert. Om ditt webhotell ikkje har mod_rewrite kan du sende e-post til levrandør og be dei installere det, eller bytte webhotell. Du kan ikkje installere det sjølv med mindre du har root på serveren.