» direct naar zoek en menu

Tijdschrift voor webwerkers » Artikel #138

Vriendelijke URL’s - met mod_rewrite en PHP

Je ziet ze steeds vaker op het wereldwijde web. De meeste moderne, opensource weblog- en content management systemen bieden er ondersteuning voor. Bij statische websites zijn ze eenvoudig te implementeren via mappen en index.html bestanden. Maar waarom gebruiken we die vriendelijke URL’s eigenlijk? En hoe zet je ze nou zelf in voor je eigen, dynamische website?

Een vriendelijke URL is herkenbaar en leesbaar, zoals bijvoorbeeld die van dit artikel: http://www.naarvoren.nl/artikel/vriendelijke_urls/ Het lijkt haast vanzelfsprekend om je website op deze manier te structureren, maar in de praktijk gebeurt het vaak niet. Zo kun je bijvoorbeeld ‘PPK on Javascript’ bij Bol.com bestellen via deze onvriendelijke URL:

Vriendelijke URL’s

Het gebruik van vriendelijke URL’s is een webrichtlijn van de Nederlandse overheid. En dat is natuurlijk niet voor niets! Het gebruik van deze URL's heeft veel voordelen. Zo zijn ze bij goed gebruik:

Met mod_rewrite...

Genoeg introductie! De voordelen zijn duidelijk, maar hoe implementeren we dit nu precies in onze eigen, met PHP gebouwde website? In ‘Aan de slag met .htaccess’ heb je al iets kunnen lezen over het gebruik van Apache’s mod_rewrite-module. Met die module kun je hele specifieke rewrite-regels voor je website schrijven, maar in deze opzet heb je aan een paar regels al voldoende.

Het .htaccess voorbeeld hieronder werkt als volgt: bij bestaande mappen of bestanden gebeurt er niks. Dit is handig, want op deze manier werken onze CSS-bestanden, afbeeldingen, etc. allemaal normaal. Bij niet bestaande bestanden of mappen wordt de aangevraagde URL als een variabele genaamd 'q' (index.php?q=) doorgespeeld naar onze index.php

<IfModule mod_rewrite.c>

    RewriteEngine On

    # bestaande mappen of bestanden
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.* - [L]

    # niet-bestaande mappen of bestanden

    RewriteRule ^(.*)/? index.php?q=$1 [L]

</IfModule>

Als een bezoeker nu bijvoorbeeld http://www.4rn0.nl/vriendelijke-urls/ intypt, gebeurt er niets bijzonders: vriendelijke-urls is namelijk een bestaande map. De map onvriendelijke-urls bestaat echter niet, dus als een bezoeker http://www.4rn0.nl/onvriendelijke-urls/ intypt treedt mod_rewrite in werking en wordt achter de schermen de URL http://www.4rn0.nl/index.php?q=http://www.4rn0.nl/ onvriendelijke-urls/ aangevraagd.

en PHP !

Aangekomen in de index.php brengen we allereerst de aangevraagde URL in kaart. Je kan het onderstaande stukje code rechtstreeks in het bestand zetten of (bij voorkeur) verder verwerken in een functie of class.

<?php

// verdeel de URL in zijn verschillende componenten
$request = parse_url($_GET['q']);
// we nemen alleen het pad, zonder de eventuele slash op het einde
$path = rtrim($request['path'], '/');

?>

Het pad van de aangevraagde URL wordt met deze code opgeslagen in de variabele $path. In dit voorbeeld is dat dus onvriendelijke-urls. Met een eenvoudige switch kunnen we vervolgens bepalen welke pagina we gaan tonen. Iedere case in de switch staat voor een pagina (Let op: voor een ‘home’ pagina gebruik je een lege case). Omdat mod_rewrite in werking treedt bij niet bestaande mappen en bestanden, is het noodzakelijk om zelf 404-foutmeldingen te genereren. Dit doen we met de default case.

Houd de hiërarchie van je navigatiestructuur trouwens in de gaten! Als onvriendelijke-urls/niet-doen bestaat, dan zou logischerwijs onvriendelijke-urls (één niveau hoger) ook moeten bestaan!

<?php

switch ($path) {

    case '':

        // code om de 'home' pagina weer te geven

        break;

    case 'onvriendelijke-urls':

        // code om de 'onvriendelijke-urls'
        // pagina weer te kunnen geven

        break;

    case 'onvriendelijke-urls/niet-doen':

        // code om de 'onvriendelijke-urls/niet-doen'
        // pagina weer te kunnen geven
        break;

    default:

        // code om 404 fouten te genereren
        break;

}

?>

Ten slotte

Hoe je een pagina uiteindelijk wil tonen staat vrij: je kan via echo de HTML rechtstreeks de pagina inschrijven, je kan gebruik maken van een include om statische HTML pagina’s tevoorschijn te halen of je kan zelfs een compleet PHP / MySQL systeem ervoor inrichten. In het voorbeeld hierboven zijn alle case mogelijkheden van te voren bekend, maar dit zou ook uit een database kunnen komen in een systeem waar men zelf pagina's kan aanmaken en de navigatiestructuur kan bepalen.

Auteur

Arno Hoogma

houdt zich als zelfstandig ondernemer onder de naam 4rn0 afwisselend met de client- en serverside van websites bezig.

Publicatiedatum: 09 mei 2007

Let op

Naar Voren is op 18 juli 2010 gestopt met publiceren. De artikelen staan als een soort archief online. Het kan dus zijn dat de informatie verouderd is en dat er inmiddels veel betere of makkelijkere manieren zijn om je doel te bereiken.

Copyright © 2002-2022 » NAAR VOREN en de auteurs