olafmoriarty
Medlem
De fleste av oss vil vel, når man skal omskrive dynamiske URL-er, skrive en .htaccess-fil som ser omtrent sånn ut (eksempelet er inspirert av Wetting2s innlegg i tråden https://www.webforumet.no/forum/php-sql-og-databaser/7850-rewrite-av-dynamisk-url.html):
Men dersom man driver et gigantisk nettsted hvor man ønsker å hente veldig mye ut av URL-en, føler jeg at dette kanskje blir litt for enkelt og på den måten ekstra komplisert. La oss si som et rent eksempel at jeg ønsker å lage et nettsted hvor brukerne kan laste opp bilder av skoene sine, endagiminesko.no.
I utgangspunktet kan jeg fint bruke koden over til dette. Denne koden gjør at jeg kan la brukerne gå inn på /upload/ for å laste opp bilder, /view/ for å vise en liste over sko som er lagt inn, og /toplist/ for en liste over de mest populære skoene akkurat nå.
Men så finner jeg ut at jeg vil lage en brukerside hvor man ved å gå til URL-en /user/brukernavn kommer til brukerens profil. Ikke noe problem, da må jeg bare slenge på en ekstra linje i .htaccess:
Sånn, da har jeg en måte å komme rett til en brukers profil på. Eller, om jeg er forutseende og ser at en slik funksjon kan jeg bruke mange steder, gjør jeg kanskje heller noe slikt:
Og for mange av seksjonene på siden vil dette fungere helt fint. Jeg kommer til brukerens profilside ved å gå til /user/brukernavn/, jeg kommer til en samleside av bilder av ett skomerke ved å gå til /shoes/skomerke/, og jeg kan vise alle bilder med en bestemt merkelapp ved å gå til /tags/tag/.
Men jeg ønsker også å la brukeren kunne skrive inn URL-er av typen /date/2010/02/03/ for å få opp alle skobilder som er lastet opp på en aktuell dato. Og kanskje ønsker jeg å sortere skobildene i en kategorioversikt av typen /cat/støvletter/lær/. Og kanskje ønsker jeg å sette opp en søkefunksjon hvor jeg vil at søkestringen også skal være lekker å se på. Etterhvert som siden får stadig flere funksjoner, blir .htaccess-dokumentet stadig større og mer uhåndterlig, noen funksjoner vil være viktig for enkelte typer filer (for en datooversikt vil det f.eks. være ganske viktig at alle innvariablene er bare tall, men for kategorioversikten er det viktig å tillate bokstaver også) ...
Og det er da jeg lurer på: Finnes det en enklere måte?
Mer spesifikt begynte jeg å lure på: Hvordan gjør Wordpress dette? De har jo en svært fleksibel URL-omskriving hvor det aller meste man skriver inn blir omskrevet til ett eller annet som viser seg å fungere ganske bra. De har kategorier, de har tags, de har datoer, de har søk, og det meste fungerer knirkefritt. Så hvordan klarer de det? Jeg tok en titt på default .htaccess for en Wordpress-blogg.
... og oppdaget at Wordpress ikke bruker .htaccess til rewriting i det hele tatt.
Det eneste som står i dette .htaccess-dokumentet, er at dersom man forsøker å gå inn på en fil eller mappe som eksisterer, skal denne vises. Alt annet sendes til index.php, uten en eneste get-variabel.
Hvilket må bety at Wordpress løser problemet med omskriving ikke i .htaccess, men i et PHP-script.
Jeg begynner selvsagt umiddelbart å lure på om det kan være en løsning som fungerer for meg også. Jeg vet fortsatt ikke 100 % hvordan de gjør dette fordi jeg opplever det som en kjempejobb å grave i den svært sammensatte Wordpress-koden, men jeg går ut fra at de bruker $_SERVER['REQUEST_URI'] og en funksjon for regular expressions av typen preg_match(). Har testet hvordan dette vil fungere på en av mine testservere, og synes at det virket overraskende bra.
Spørsmålet er selvfølgelig: Er det noen ulemper med å gjøre dette på denne måten? I ytelse, sikkerhet e.l.? Eller vil dette i praksis kunne fungere nøyaktig like godt som å bruke en RewriteRule i .htaccess?
Kode:
RewriteEngine on
RewriteRule ^([a-zA-Z0-9]+)/?$ index.php?do=$1
Men dersom man driver et gigantisk nettsted hvor man ønsker å hente veldig mye ut av URL-en, føler jeg at dette kanskje blir litt for enkelt og på den måten ekstra komplisert. La oss si som et rent eksempel at jeg ønsker å lage et nettsted hvor brukerne kan laste opp bilder av skoene sine, endagiminesko.no.
I utgangspunktet kan jeg fint bruke koden over til dette. Denne koden gjør at jeg kan la brukerne gå inn på /upload/ for å laste opp bilder, /view/ for å vise en liste over sko som er lagt inn, og /toplist/ for en liste over de mest populære skoene akkurat nå.
Men så finner jeg ut at jeg vil lage en brukerside hvor man ved å gå til URL-en /user/brukernavn kommer til brukerens profil. Ikke noe problem, da må jeg bare slenge på en ekstra linje i .htaccess:
Kode:
RewriteRule ^user/([a-zA-Z0-9]+)/?$ index.php?do=user&username=$1
Sånn, da har jeg en måte å komme rett til en brukers profil på. Eller, om jeg er forutseende og ser at en slik funksjon kan jeg bruke mange steder, gjør jeg kanskje heller noe slikt:
Kode:
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ index.php?do=$1&var=$2
Og for mange av seksjonene på siden vil dette fungere helt fint. Jeg kommer til brukerens profilside ved å gå til /user/brukernavn/, jeg kommer til en samleside av bilder av ett skomerke ved å gå til /shoes/skomerke/, og jeg kan vise alle bilder med en bestemt merkelapp ved å gå til /tags/tag/.
Men jeg ønsker også å la brukeren kunne skrive inn URL-er av typen /date/2010/02/03/ for å få opp alle skobilder som er lastet opp på en aktuell dato. Og kanskje ønsker jeg å sortere skobildene i en kategorioversikt av typen /cat/støvletter/lær/. Og kanskje ønsker jeg å sette opp en søkefunksjon hvor jeg vil at søkestringen også skal være lekker å se på. Etterhvert som siden får stadig flere funksjoner, blir .htaccess-dokumentet stadig større og mer uhåndterlig, noen funksjoner vil være viktig for enkelte typer filer (for en datooversikt vil det f.eks. være ganske viktig at alle innvariablene er bare tall, men for kategorioversikten er det viktig å tillate bokstaver også) ...
Og det er da jeg lurer på: Finnes det en enklere måte?
Mer spesifikt begynte jeg å lure på: Hvordan gjør Wordpress dette? De har jo en svært fleksibel URL-omskriving hvor det aller meste man skriver inn blir omskrevet til ett eller annet som viser seg å fungere ganske bra. De har kategorier, de har tags, de har datoer, de har søk, og det meste fungerer knirkefritt. Så hvordan klarer de det? Jeg tok en titt på default .htaccess for en Wordpress-blogg.
... og oppdaget at Wordpress ikke bruker .htaccess til rewriting i det hele tatt.
Kode:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Det eneste som står i dette .htaccess-dokumentet, er at dersom man forsøker å gå inn på en fil eller mappe som eksisterer, skal denne vises. Alt annet sendes til index.php, uten en eneste get-variabel.
Hvilket må bety at Wordpress løser problemet med omskriving ikke i .htaccess, men i et PHP-script.
Jeg begynner selvsagt umiddelbart å lure på om det kan være en løsning som fungerer for meg også. Jeg vet fortsatt ikke 100 % hvordan de gjør dette fordi jeg opplever det som en kjempejobb å grave i den svært sammensatte Wordpress-koden, men jeg går ut fra at de bruker $_SERVER['REQUEST_URI'] og en funksjon for regular expressions av typen preg_match(). Har testet hvordan dette vil fungere på en av mine testservere, og synes at det virket overraskende bra.
Spørsmålet er selvfølgelig: Er det noen ulemper med å gjøre dette på denne måten? I ytelse, sikkerhet e.l.? Eller vil dette i praksis kunne fungere nøyaktig like godt som å bruke en RewriteRule i .htaccess?