Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  23 4296
Trigonoceps occipita
vidarlo's Avatar
Donor
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:

Kode

RewriteEngine on
RewriteRule ^([0-9]+)/([0-9]+)/([0-9]+)$ index.php?cat=$1&side=$2&shizzle=$3
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:

Kode

RewriteRule URL_som_skal_omskrivast URL_slik_den_faktisk_er_på_server [options]
Så et lite eksempel:

Kode

RewriteEngine on
RewriteRule ^topp$ index.html
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.

Kode

RewriteEngine on
RewriteRule ^([0-9]+)$ index.php?side=$1
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

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
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!

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}
Tekstfila kategorier.txt kan då inneholde:

Kode

hovedkort	1
ram		2
cpu		3
pcer		4
kabinett	5
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.

Kode

RewriteCond %{HTTP_USER_AGENT} ^.*Internet Explorer.*
RewriteRule ^stilark.css$ iestilark.css

RewriteRule ^stilark.css$ standard.css
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:

Kode

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://example.com/.*$
RewriteRule .*\.(gif|png|jpg|jpeg)$ http://example.com/404.html [R]
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.
Bra jobba Vidarlo!

Var akkurat på tur å lese om dette, så du kom i grevens tid til unnsetning!
Fin tutorial dette her Vidarlo.

Spesielt liker jeg måten den er skrevet på. Alt for mange guider gjør ting til å bli mer komplisert enn det trenger å være. Måten denne er skrevet på gjør at fokus kan rettes mot det du lærer vekk, og ikke på en tungt skrevet tekst. Samtidig er det et stort pluss at guiden er strukturert på en pen og ryddig måte, dette gir meg som leser god oversikt.
Jepp, skulle prøve dette på one.com sin server på domenet mitt. Får litt problemer, fant ut at jeg må inn i DNS settings til one.com og deaktivere *.nestande.net. Nå kan det jo ta litt tid før det funker, men forhåpentligvis får jeg ryddet litt opp i rotet som CuteNews generer.

Bare sånn at jeg har forstått det riktig:

Kode

RewriteEngine on
RewriteRule ^test$ index.php
Dette vil sende sub.domene.no/test til sub.domene.no/index.php?
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av devotio

Kode

RewriteEngine on
RewriteRule ^test$ index.php
Dette vil sende sub.domene.no/test til sub.domene.no/index.php?
Vis hele sitatet...
Quite right.
Sitat av vidarlo
Quite right.
Vis hele sitatet...
Fucking retards one.com! For å aktivere mod_rewrite må jeg deaktivere *.domene.no -> domene.no/* i DNS. Skulle jo liksom bruke mod_rewrite på subdomenet mitt...
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Tipper det er fordi den forflyttinga bruker mod_rewrite eg

Går heilt fint an å bruke mod_rewrite til å skrive om *heile* urlen, men har med vilje bare tatt for meg relative paths, fordi det ellers lett kan oppstå krøll har eg funne ut.
Har prøvd å søke på nettet etter hvordan jeg får www.domene.net/subdomene til subdomene.domene.net/ Det eneste jeg finner ut er at dette krever endringer i DNS. Har du noen tips?
Sitat av vidarlo

Kode

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://example.com/.*$
RewriteRule .*\.(gif|png|jpg|jpeg)$ http://example.com/404.html [R]
Vis hele sitatet...
Vil den også fungere om noen prøver å vise bilder ved bruk av [img] tags?
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av Grantax
Vil den også fungere om noen prøver å vise bilder ved bruk av [img] tags?
Vis hele sitatet...
Den vil fungere uansett, sålenge bildet er *i* eller linka til fra ei nettside forskjellige fra example.com slik som den står der.
Sitat av Grantax
Vil den også fungere om noen prøver å vise bilder ved bruk av [img] tags?
Vis hele sitatet...
Tenker du på img tag som i BBcode? Det vil stoppe bilder fra det også ja, BBcode blir jo oversatt til HTML.
Sitat av devotio
Tenker du på img tag som i BBcode? Det vil stoppe bilder fra det også ja, BBcode blir jo oversatt til HTML.
Vis hele sitatet...
Ja, men jeg bare lurte på om "HTTP_REFERER" bare ble utløst om noen besøkte siden via en link, og ikke når noen så bildet via en annen side.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av devotio
Har prøvd å søke på nettet etter hvordan jeg får www.domene.net/subdomene til subdomene.domene.net/ Det eneste jeg finner ut er at dette krever endringer i DNS. Har du noen tips?
Vis hele sitatet...

Kode

RewriteRule ^(.*)/$ http://$1.example.com/ [L,R=301]
Merk at her *må* du bruke redirect-flags.

Den vil videresende example.com/abcabc/ til abcabc.example.com, men den vil ikkje viaresende example.com/123/ til 123.example.com (les om regexp viss du vil skrive egne uttrykk.), og den vil heller ikkje skrive om example.com/foo til foo.example.com.

Det du er ute etter er kanskje litt meir statisk?

Kode

RewriteRule ^subdomene$ http://subdomene.example.com [L,R=301]
Det siste eksempelet er statisk, og du må lage ei linje pr. subdomene.

Sitat av Grantax
Ja, men jeg bare lurte på om "HTTP_REFERER" bare ble utløst om noen besøkte siden via en link, og ikke når noen så bildet via en annen side.
Vis hele sitatet...
Ærlig talt. Dette er første treff ved googling etter http referer...
Sist endret av vidarlo; 10. april 2007 kl. 20:46.
Trenger litt hjelp:
Har en tekstfil som har innhold:

kategorier.txt

Kode

artikler	1
nyheter		2
infosenter	3
interaktiv	4
Url skal bli slik:
http://www.example.com/ (en av de i kategorier.txt) / (tilfeldig verdi) / (tilfeldig verdi)
Eks: http://www.example.com/nyheter/test-nyhet/1

Den skal da bli skrevet om til:

example.com/index.php?kategori=nyheter&var1=test-nyhet&var2=1

Noen som kan gi meg en hjelpende hand ?
Hvis nyheter ikke skal bli om til 2 så forstår jeg ikke hva du skal med den tekstfilen der.
Takk for en fantastisk guide vidarlo!

Tar jeg ikke feil vil jeg gjette det blir noe slikt:

Kode

RewriteMap kategorier txt:kategorier.txt
RewriteRule ^(.*)/(.*)/([0-9]+)$ index.php?kategori=${kategorier:$1}&var1=$2&var2=$3
▼ ... noen uker senere ... ▼
Valgfri brukertittel
Kekurikekaka's Avatar
Hva er koden for å gjøre om http://www.eksempel.net/index.php til http://www.eksempel.net/ ?

Prøvde å bare ha den adressen som det skal bli til, blank også med bare /, men det funke jo ikke fikk bare opp feil når jeg prøvde å gå inn i siden.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
RewriteRule index.php / [R]

Burde ikkje den eine linja fikse det? Men kvifor du vil det kan eg ikkje heilt forstå...
Valgfri brukertittel
Kekurikekaka's Avatar
Nettsiden videresender ikke ordentlig


Firefox har oppdaget at tjeneren videresender forespørselen til denne adressen på en måte som aldri vil fullføre.


* Dette problemet kan av og til skyldes at informasjonskapsler er
avslått.


Den meldingen fikk jeg da
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av PureOwnage
Nettsiden videresender ikke ordentlig
Den meldingen fikk jeg da
Vis hele sitatet...
Da er problemet enkelt og greit at du forwarder til /, som igjen forwarder til index.php, også har du evig runddans.

Eg kan forøvrig ikkje sjå gode grunner til å prøve å kvitte meg med /index.php i slutten av URL...
Valgfri brukertittel
Kekurikekaka's Avatar
Jeg vil kvitte meg med news.php

Index.php sender deg videre til news.php Også vil jeg at alt som skal stå er http://www.adresse.net/ og ikke http://www.adresse.net/news.php
▼ ... over et år senere ... ▼
domene.com/ peker til domene.com/index.php (ref. konfigurasjon i apache), du peker så index.php videre til news.php, som plutselig blir snappet opp av en rewrite og sendt tilbake igjen til domene.com/, som igjen sender deg videre til index.php grunnet konfigurasjon av apache. Det burde du da også fatte.

(Jeg er klar over alderen på denne tråden, men bare for å avklare problemet.)
Sist endret av Deezire; 4. januar 2009 kl. 02:38.
▼ ... over et år senere ... ▼
Likte denne guiden

Har et lite problem. Jeg bruker dette utrykket:

RewriteRule ^([a-z]+)/([a-z]+)$ index.php?side=$1&o=$2

Og når jeg går inn på siden så forsvinner CSS'en. Noen ide hvorfor?
Sitat av fulloggal Vis innlegg
Likte denne guiden

Har et lite problem. Jeg bruker dette utrykket:

RewriteRule ^([a-z]+)/([a-z]+)$ index.php?side=$1&o=$2

Og når jeg går inn på siden så forsvinner CSS'en. Noen ide hvorfor?
Vis hele sitatet...
Tror kanskje det kan være fordi Apache skriver om url til CSS filen din også?