Nätit urlit: Apache Rewrite ja PHP

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

This site uses Akismet to reduce spam. Learn how your comment data is processed.