Väsään nettisivua, jossa käyttäjät katselevat tietokannasta kaivettavaa sisältöä tietyn tunnisteen perusteella. Siis tähän tapaan:
http://www.example.com/index.php?id=tunniste
Tämä on perinteinen tapa. Tarkoitus kuitenkin olisi, että käyttäjät näpyttelevät osoitteita käsin (kyseessä on vähän urlinlyhennyspalvelun tyylisesti jutusta), joten osoitteista pitäisi karsia kaikki turha pois. Ideaalitapaus olisi näin:
http://www.example.com/tunniste
Onneksi tämä on helppo toteuttaa, tekemällä pieniä muutoksia .htaccess-tiedostoon.
.htaccess
Hakemiston .htaccess-tiedostosta pitää tehdä tällainen:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Tässä kytketään päälle Apachen mod_rewrite-moduuli (peruskauraa, pitäisi löytyä ihan joka paikasta, jos ei löydy, urputa ylläpitäjälle kunnes löytyy) ja sen jälkeen asetellaan vähän ehtoja. RewriteCond-rivit varmistavat, että skripti ei blokkaa pääsyä olemassa oleviin tiedostoihin ja hakemistoihin. Jos haettu osoite (esimerkissä siis /tunniste) ei viittaa mihinkään olemassaolevaan tiedostoon (!-f) tai hakemistoon (!-d), voidaan jatkaa.
RewriteRule-rivi ohjaa sitten kaikki pyynnöt index.php-tiedostoon. Nyt siis kirjoitti osoitteeksi mitä tahansa, se ohjataan index.php:hen, mikäli kyseessä ei ole olemassaoleva tiedosto (tässä tapauksessa esimerkiksi joku kuva tai css-tyylitiedosto).
Tämä koodi on muuten kopioitu suoraan WordPressin tekemästä .htaccessista — WordPress käyttää samaa systeemiä nätteihin permalinkkeihin.
PHP-koodi
Osoite, jolla index.php haettiin, selviää PHP:ssa näin:
$id = str_replace('/', '', $_SERVER['REQUEST_URI']);
if ($i = strpos($id, '?')) $id = substr($id, 0, $i);
Nyt haluttu tunniste on muuttujassa $id. Ensimmäinen rivi kaivaa pyynnön URI:n $_SERVER-muuttujasta ja poistaa alusta tarpeettoman kauttaviivan. Toinen rivi siivoaa mahdolliset muuttujat perästä (jos tunniste on muotoa /tunniste?parametri=arvo, tuon jälkeen jää vain tunniste) — parametrithan saa sitten luettua kätevämmin $_REQUEST-muuttujasta.
Ja näin on selvillä tunniste, jolla voi sitten tehdä jotain hauskaa.