» direct naar zoek en menu

Tijdschrift voor webwerkers » Artikel #86

Gebruiksvriendelijke url’s met PHP - Stijn Steutel

Bij de bouw van een site wordt vaak weinig aandacht besteed aan de samenstelling van de URL’s. Vooral bij dynamische sites zie je vaak ingewikkelde en lange tekenreeksen.

Een voorbeeld van een ingewikkelde URL is deze op de website van IBM:

http://www-132.ibm.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=-840&productId=8707186&storeId=1&langId=-1&dualCurrId=73&categoryId=2302836

Dit adres geeft de gebruiker weinig houvast. Je leidt er niet uit af dat het de URL is van een pagina over een (overigens respectabel) notebook. Het zegt wel iets over de gebruikte techniek op de webserver, wat in verband met de veiligheid zelfs minder verstandig is.

Wat er verder niet deugt aan deze URL:

Zo kan het ook: http://www.apple.com/powerbook/specs.html

Uit dit adres kun je opmaken dat de pagina waarschijnlijk over een Powerbook van Apple gaat. Over de URL’s van de hele Apple-site is trouwens goed nagedacht, want als je de specificaties van de PowerMac wil weten hoef je de navigatie van de website niet eens te gebruiken. http://www.apple.com/powermac/specs.html intikken is al genoeg.

Dus: een goed samengestelde URL kan de gebruiker informatie geven over de inhoud van de opgevraagde pagina, de structuur van de site en de plek waar men zich bevindt. Een goed geplande opbouw van alle URL’s van een site geeft de bezoeker bovendien de mogelijkheid te navigeren met behulp van de locatiebalk, wat vooral voor “professionele gebruikers” prettig kan zijn.

Tips bij het samenstellen van URL’s:

  1. Hou ze kort en duidelijk
  2. Zorg ervoor dat de URL’s de structuur van de site weerspiegelen
  3. Wees consistent (gebruik bijvoorbeeld steeds dezelfde extensie)
  4. Zorg dat de URL ook zonder "www" werkt, en ook met "ww" of "wwww"
  5. Gebruik geen hoofdletters
  6. Blijf als het kan onder de 76 karakters in verband met het mailen van de URL

Zorg eventueel voor makkelijk te raden en makkelijk te communiceren start-URL’s, die automatisch doorverwijzen. Microsoft doet dat bijvoorbeeld met de site voor Microsoft Word: http://microsoft.com/word. Deze pagina bestaat niet, maar stuurt je wel door naar de Word-afdeling: http://office.microsoft.com/home/office.aspx?assetid=FX01085799.

Zelf maken!

Allereerst moet je vooraf goed nadenken over de naamgeving van mappen en bestanden. Probeer consequent te zijn. Voor een statische site is dat eigenlijk al voldoende.

Voor dynamische sites zijn er meerdere manieren om obscure URL’s wat duidelijker te maken. Hier worden er twee besproken: het gebruik van extra pad-informatie (beschikbaar in PATH_INFO) en het gebruik van een 404 script. De voorbeelden zijn gericht op de combinatie PHP/Apache; voor bijvoorbeeld IIS en Java zijn soortgelijke oplossingen mogelijk.

1: Gebruik extra pad-informatie (PATH_INFO)

Informatie in de URL wordt meestal in de querystring meegegeven, bijvoorbeeld:

http://example.com/nieuws/artikel.php?categorie_id=3&id=26

Hier worden de variabelen id en categorie_id meegegeven aan het script artikel.php. Dit script vraagt het bewuste artikel vervolgens op in een database en formuleert de html.

Er is echter nog een manier om informatie aan je script door te geven, en dat is met behulp van het “pad”. Dat ziet er zo uit:

http://example.com/nieuws/artikel.php/3/26

Apache doorloopt de URL tot het een bestand vindt dat het kan aanroepen, in dit geval "artikel.php". De rest van de URL is in PHP beschikbaar in de super-global PATH_INFO:

// pak de variabelen uit het pad
list($dummy, $id, $categorie_id) = explode('/', $_SERVER['PATH_INFO']);


De eerste waarde uit de array die explode teruggeeft is altijd leeg omdat PATH_INFO met een slash begint, die vangen we op in $dummy. Daarna volgen de variabelen die we nodig hebben. Je kunt uiteraard zoveel variabelen meegeven als je wilt. De volgorde van de variabelen in de URL is bij deze methode wel essentieel; het vergt de nodige vlijt om daar op te letten.

We zijn het vraagteken nu kwijt, maar het kan nog eleganter. Mooier is bijvoorbeeld:

http://example.com/nieuws/artikel/3/26

Hoe raak je de extensie “.php” kwijt? Om te beginnen hernoemen we “artikel.php” naar “artikel”. Zonder de “.php” extensie wordt het script echter niet uitgevoerd, maar direct als platte tekst naar de browser verzonden. Daarom moeten we Apache duidelijk maken dat het bestand “artikel” naar de PHP-parser gestuurd moet worden. En dat kan door een “.htaccess” bestandje aan te maken in de betreffende map, en er de volgende regels in op te nemen:

# "artikel" is een php-script
<Files artikel>
    ForceType application/x-httpd-php
</Files>


Tenslotte is het fraaier om de getallen te vervangen door woorden. Dit geeft meer informatie en is implementatieonafhankelijk. Dus:

http://example.com/nieuws/artikel/economie/inflatie

Hier gebruik je dus strings om het artikel uit de database te halen. Dit kan prima, denk er wel aan een index voor de bewuste kolom aan te maken.

2: Gebruik een 404-script

Als Apache een document niet kan vinden, kijkt de server eerst of ergens in de configuratiebestanden is aangegeven welke pagina in dat geval getoond moet worden. Ook dit kun je aangeven in je .htaccess bestandje:

ErrorDocument 404 /404.php

In het bestand “404.php” kun je een generieke melding geven, maar je kunt het ook gebruiken als basis voor het weergeven van pagina’s. Hoe je dat precies doet hangt af van de inhoud en opbouw van je site. Je kunt bijvoorbeeld afspreken dat het eerste deel van de URL een onderdeel van je site is, en de daaropvolgende delen de variabelen voor dat onderdeel.

Maar eerst moeten we ervoor zorgen dat de pagina de juiste status-code meekrijgt. Apache gaat er nog steeds vanuit dat het een echte 404 betreft, en stuurt dus een 404 code naar je browser. Daar moeten we zelf weer code 200 van maken:

// maak van 404 weer 200
header('HTTP/1.1 200 OK');


Vervolgens nemen we onze laatste URL:

http://example.com/nieuws/artikel/economie/inflatie

In het 404 script bekijk je de eerste variabele na de domeinnaam, en op grond daarvan “include” je het stukje code dat je nodig hebt om de pagina's van dat onderdeel van je site te genereren. De informatie die je nodig hebt staat deze keer niet in PATH_INFO, maar in REQUEST_URI.

$pad = explode('/', $_SERVER['REQUEST_URI']);

// welk onderdeel?
$onderdeel = $pad[1];

if ($onderdeel == 'nieuws') {
    // de code voor nieuwspagina's
    include('nieuws.inc.php');
}


Zo doe je dat voor alle onderdelen. In het nieuws-script achterhaal je vervolgens de andere variabelen, vraag je het artikel op uit de database en formuleer je de html. De variabele REQUEST_URI bevat steeds het het volledige pad ten opzichte van de document-root; iets om rekening mee te houden als je het 404-script in een subdirectory plaatst.

Als onderaan de if/else reeks aangekomen duidelijk is dat de pagina echt niet bestaat, dan kun je alsnog een 404-melding laten weergeven. Overigens worden bestanden die wel bestaan natuURLijk gewoon weergegeven; het 404-script wordt alleen aangeroepen als er bij de opgevraagde URL geen bestand te vinden is.

Een nadeel van deze methode is dat een groot deel van de pagina’s van je site voor Apache uit 404’s bestaat. Die komen in de error-log terecht. Dit maakt de error-log’s minder bruikbaar.

Meer lezen?

Auteur

Stijn Steutel

is mede-oprichter van internetbureau MCAT, waar hij graag complexe technische problemen op een elegante manier oplost.

Daarnaast is hij de man achter Mtrack, een pakket voor website-statistieken.

Publicatiedatum: 25 juni 2004

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-heden » NAAR VOREN en de auteurs