Tutorials
Mod Rewrite
Het maken van zoekmachine vriendelijke URL's met behulp van Apache's mod_rewrite module
Pagina 1
Inleiding
De mod_rewrite module van Apache geeft ons de mogelijkheid om een bepaalde url door te linken naar een ander, zonder dat de bezoeker daar iets van merkt. Dit geeft ons een aantal handige mogelijkheden zoals het doorsturen van oude urls naar nieuwe adressen of het zoekmachine vriendelijk maken van urls.
In deze tutorial zal ik aan de hand van voorbeelden iets dieper ingaan op de mogelijkheden en het gebruik van de mod_rewrite module van Apache. Ik zal onder andere laten zien hoe je oude urls door kunt linken naar nieuwe locaties en hoe je je urls zoekmachine vriendelijk kunt maken.
Merk op dat deze tutorial op zich weinig met PHP te maken heeft. Dit gaat puur over een toepassing van een functionaliteit van Apache, de webserver dus. In deze tutorial zullen we dan ook werken met een .htaccess bestand waarin we alle aanpassingen doen. Er komt vrij weinig tot geen PHP code aan te pas.
Benodige voorkennis
[li]Werken met .htaccess[/li]
[li]Reguliere Expressies[/li]
In deze tutorial zal ik aan de hand van voorbeelden iets dieper ingaan op de mogelijkheden en het gebruik van de mod_rewrite module van Apache. Ik zal onder andere laten zien hoe je oude urls door kunt linken naar nieuwe locaties en hoe je je urls zoekmachine vriendelijk kunt maken.
Merk op dat deze tutorial op zich weinig met PHP te maken heeft. Dit gaat puur over een toepassing van een functionaliteit van Apache, de webserver dus. In deze tutorial zullen we dan ook werken met een .htaccess bestand waarin we alle aanpassingen doen. Er komt vrij weinig tot geen PHP code aan te pas.
Benodige voorkennis
[li]Werken met .htaccess[/li]
[li]Reguliere Expressies[/li]
Pagina 2
Vereiste instellingen
Om gebruik te kunnen maken van de mod_rewrite module moet deze wel geinstalleerd en geactiveerd zijn. Standaard zal deze module wel geinstaleerd maar niet geactiveerd zijn. Ik zal dus eerst uitleggen hoe je dat kunt controleren en eventueel kunt aanpassen.
De makkelijkste manier om te controleren of de module geactiveerd is, is door in de phpinfo te kijken. Plaats onderstaande code in een leeg bestand, en voer het uit op je webserver.
Voorbeeld 1: phpinfo opvragen
<?php
phpinfo();
?>
Ga op zoek naar een kopje met apache erin en zoek het gedeelte met de Loaded Modules. Als in dit lijstje onder andere 'mod_rewrite' voorkomt, is de module geactiveerd en kun je hem zonder problemen gebruiken.
Staat 'mod_rewrite' er niet tussen, dan zal de module nog geactiveerd moeten worden. Deze instelling kunnen we aanpassen in het httpd.conf bestand. Als je te maken hebt met een webhost is de kans groot dat je dit niet zelf kunt aanpassen. Neem dan contact op met je host.
Om de mod_rewrite modulte te activeren moet je in httpd.conf op zoek gaan naar onderstaande regel:
Haal het # voor deze regel weg om de module te activeren. Vergeet niet om Apache te herstarten, anders zullen de wijzigingen geen effect hebben.
Mocht je deze regel niet kunnen vinden in je httpd.conf, dan betekent dat dat de module niet geinstalleerd is. Daartoe kun je de volgende regels neenemen tijdens het compilen van Apache:
Mocht je geen idee hebben hoe je dat moet doen, ga dan eens langs www.apache.org om te zien hoe je de mod_rewrite module kunt installeren.
Mocht je, ondanks dat de mod_rewrite module wel geinstalleerd en geactiveerd is, toch nog een Internal Server error krijgen als je deze methode toe probeer te passen, controleer dan nog eens de volgende instellingen.
In de httpd.conf zul je in voor de directory waarin je de .htaccess plaatst (in dit voorbeeld de root) het volgende op moeten nemen:
Dit bepaald wat voor informatie er in een .htaccess mag staan en zorgt er dus voor dat je rewrite informatie kunt opnemen.
Verder kun je in je .htaccess de volgende instelling opnemen, die overigens in de meeste gevallen standaard goed staat:
Zonder dit ingeschakeld is het niet mogelijk om de mod_rewrite module te gebruiken.
De makkelijkste manier om te controleren of de module geactiveerd is, is door in de phpinfo te kijken. Plaats onderstaande code in een leeg bestand, en voer het uit op je webserver.
Voorbeeld 1: phpinfo opvragen
<?php
phpinfo();
?>
Ga op zoek naar een kopje met apache erin en zoek het gedeelte met de Loaded Modules. Als in dit lijstje onder andere 'mod_rewrite' voorkomt, is de module geactiveerd en kun je hem zonder problemen gebruiken.
Staat 'mod_rewrite' er niet tussen, dan zal de module nog geactiveerd moeten worden. Deze instelling kunnen we aanpassen in het httpd.conf bestand. Als je te maken hebt met een webhost is de kans groot dat je dit niet zelf kunt aanpassen. Neem dan contact op met je host.
Om de mod_rewrite modulte te activeren moet je in httpd.conf op zoek gaan naar onderstaande regel:
#LoadModule rewrite_module modules/mod_rewrite.so
Haal het # voor deze regel weg om de module te activeren. Vergeet niet om Apache te herstarten, anders zullen de wijzigingen geen effect hebben.
Mocht je deze regel niet kunnen vinden in je httpd.conf, dan betekent dat dat de module niet geinstalleerd is. Daartoe kun je de volgende regels neenemen tijdens het compilen van Apache:
./configure
--enable-module=rewrite
--enable-shared=rewrite
Mocht je geen idee hebben hoe je dat moet doen, ga dan eens langs www.apache.org om te zien hoe je de mod_rewrite module kunt installeren.
Mocht je, ondanks dat de mod_rewrite module wel geinstalleerd en geactiveerd is, toch nog een Internal Server error krijgen als je deze methode toe probeer te passen, controleer dan nog eens de volgende instellingen.
In de httpd.conf zul je in voor de directory waarin je de .htaccess plaatst (in dit voorbeeld de root) het volgende op moeten nemen:
<Directory />
AllowOverride All
</Directory>
Dit bepaald wat voor informatie er in een .htaccess mag staan en zorgt er dus voor dat je rewrite informatie kunt opnemen.
Verder kun je in je .htaccess de volgende instelling opnemen, die overigens in de meeste gevallen standaard goed staat:
Options +FollowSymLinks
Zonder dit ingeschakeld is het niet mogelijk om de mod_rewrite module te gebruiken.
Pagina 3
Basis van Mod Rewrite
Om deze basis van het gebruik van de mod_rewrite modulen uit te leggen, zal ik het voorbeeld van het doorsturen van oude urls naar nieuwe adressen nemen. Maar voordat we daarmee beginnen, kijken we eerst eens hoe we nu eigenlijk de module zelf kunnen gebruiken.
Allereerst moeten we Apache natuurljk kunnen vertellen welke acties uitgevoerd moeten worden. Daarvoor hebben we twee opties tot onze beschikking: een .htaccess bestand of aanpassingen in de httpd.conf. Aangezien de meeste webhosts geen toegang geven tot de httpd.conf zal ik me beperken tot het werken met een .htaccess bestand.
Als je geen idee hebt wat een .htaccess bestand is of hoe je er een aan moet maken, kijk dan eens naar deze tutorial.
Het begin van elke rewrite opdracht is het aanzetten van de rewrite engine om. Daartoe voegen we de volgende regel toe aan onze .htaccess:
Nu de rewrite engine ingeschakeld is, kunnen we beginnen met rewriten.
Voorbeeld 2: Het doorsturen van pagina's
Dit is het meest basale voorbeeld van het gebruik van de mod_rewrite module. Allereerst zien we het inschakelen van de rewrite engine met RewriteEngine On. Vervolgens gebruiken we RewriteBase / om aan te geven dat we de root van onze website willen gebruiken als basis voor rewrite opdrachten.
De belangrijkste regel uit dit voorbeeldje is de laatste regel. Een RewriteRule geeft aan welke actie nou precies ondernomen moet worden. In dit geval wordt oud.php herschreven naar nieuw.php en wordt de inhoud van nieuw.php getoond. Merk op dat je hier als gebruiker helemaal niets van ziet, in de url blijft gewoon oud.php staan.
De syntax van een RewriteRule is altijd als volgt:
In voorbeeld 2 was old.php dus de waarde voor PATTERN en new.php de waarde voor DESTINATION. Over de optionele FLAGS komen we later in deze tutorial te spreken.
Een handige cheat sheet voor het gebruik van Mod Rewrite is die van ILoveJackDaniels.com. In de rest van deze tutorial zal ik regelmatig naar deze sheet verwijzen.
Als PATTERN in de mod rewrite syntax is het ook mogelijk om een regulieren expressie te gebruiken. Dit is bijvoorbeeld handig als we meerdere bestanden tegelijk willen matchen.
Voorbeeld 3: Pagina's uit een directory doorverwijzen
Wat er met deze RewriteRule gebeurt is dat van alle bestanden en onderliggende mappen in oude_map het pad herschreven wordt en oude_map vervangen wordt door nieuwe_map. Gevolg is dus dat de inhoud uit de nieuwe map geladen wordt terwijl de url nog naar de oude map verwijst. Dit is dus erg handig als je een map een keer hernoemt hebt.
In dit voorbeeld gebruiken we een reguliere expressie om alle bestanden in een bepaalde map aan te geven. Voor een uitleg over reguliere expressies zou je deze tutorial kunnen bekijken.
Ook het reguliere expressie gedeelte van de Mod Rewrite Cheat Sheet kan een handig geheugensteuntje zijn:

Allereerst moeten we Apache natuurljk kunnen vertellen welke acties uitgevoerd moeten worden. Daarvoor hebben we twee opties tot onze beschikking: een .htaccess bestand of aanpassingen in de httpd.conf. Aangezien de meeste webhosts geen toegang geven tot de httpd.conf zal ik me beperken tot het werken met een .htaccess bestand.
Als je geen idee hebt wat een .htaccess bestand is of hoe je er een aan moet maken, kijk dan eens naar deze tutorial.
Het begin van elke rewrite opdracht is het aanzetten van de rewrite engine om. Daartoe voegen we de volgende regel toe aan onze .htaccess:
RewriteEngine On
Nu de rewrite engine ingeschakeld is, kunnen we beginnen met rewriten.
Voorbeeld 2: Het doorsturen van pagina's
RewriteEngine On
RewriteBase /
RewriteRule oud.php nieuw.php
Dit is het meest basale voorbeeld van het gebruik van de mod_rewrite module. Allereerst zien we het inschakelen van de rewrite engine met RewriteEngine On. Vervolgens gebruiken we RewriteBase / om aan te geven dat we de root van onze website willen gebruiken als basis voor rewrite opdrachten.
De belangrijkste regel uit dit voorbeeldje is de laatste regel. Een RewriteRule geeft aan welke actie nou precies ondernomen moet worden. In dit geval wordt oud.php herschreven naar nieuw.php en wordt de inhoud van nieuw.php getoond. Merk op dat je hier als gebruiker helemaal niets van ziet, in de url blijft gewoon oud.php staan.
De syntax van een RewriteRule is altijd als volgt:
RewriteRule PATTERN DESTINATION [FLAGS]
In voorbeeld 2 was old.php dus de waarde voor PATTERN en new.php de waarde voor DESTINATION. Over de optionele FLAGS komen we later in deze tutorial te spreken.
Een handige cheat sheet voor het gebruik van Mod Rewrite is die van ILoveJackDaniels.com. In de rest van deze tutorial zal ik regelmatig naar deze sheet verwijzen.
Als PATTERN in de mod rewrite syntax is het ook mogelijk om een regulieren expressie te gebruiken. Dit is bijvoorbeeld handig als we meerdere bestanden tegelijk willen matchen.
Voorbeeld 3: Pagina's uit een directory doorverwijzen
RewriteEngine On
RewriteBase /
RewriteRule ^oude_map/(.*)$ nieuwe_map/$1
Wat er met deze RewriteRule gebeurt is dat van alle bestanden en onderliggende mappen in oude_map het pad herschreven wordt en oude_map vervangen wordt door nieuwe_map. Gevolg is dus dat de inhoud uit de nieuwe map geladen wordt terwijl de url nog naar de oude map verwijst. Dit is dus erg handig als je een map een keer hernoemt hebt.
In dit voorbeeld gebruiken we een reguliere expressie om alle bestanden in een bepaalde map aan te geven. Voor een uitleg over reguliere expressies zou je deze tutorial kunnen bekijken.
Ook het reguliere expressie gedeelte van de Mod Rewrite Cheat Sheet kan een handig geheugensteuntje zijn:

Pagina 4
Zoekmachine vriendelijke urls
De mod_rewrite module is bij uitstek geschikt om zoekmachine vriendelijke urls te maken. Naast het feit dat zulk soort urls goed te interpreteren zijn door zoekmachine bots, zien ze er ook een stuk vriendelijker uit.
Wat zijn zoekmachine vriendelijke urls nu eigenlijk? Dat is een vraag die ik allereerst eens zal beantwoorden aan de hand van een voorbeeld. We zijn allemaal wel eens urls van het volgende type tegen gekomen:
De zoekmachine vriendelijke variant van deze url zou als volgt kunnen zijn:
Dat ziet er al een stuk beter uit nietwaar? En naast dat ze er een stuk beter uitzien, hebben deze urls ook nog als voorbeeld dat deze te begrijpen zijn door zoekmachine bots. Daardoor kan de content van je hele site geindexeerd worden en blijven ze niet op de index pagina steken.
Dit alles is mogelijke met de mod_rewrite module. Laten we om te beginnen eerst eens naar een eenvouiger voorbeeld kijken.
Voorbeeld 4: Zoekmachine vriendelijke url
In dit voorbeeld wordt bijvoorbeeld de url 'http://www.jouwsite.nl/tutorials/12/'; omgeschreven naar 'http://www.jouwsite.nl/tutorials.php?id=12';. We hoeven nu niet meer de naam van de GET variabele id in de url op te nemen, het is genoeg om alle het id daar te plaatsen.
Hoe gaat dat nu als we meerdere GET variabelen hebben? Stel dat we de van de volgende urls allemaal zoekmachine vriendelijke urls zouden willen hebben:
[li]http://www.jouwsite.nl/tutorials.php?id=10&page=4&replies=20[/li]
[li]http://www.jouwsite.nl/tutorials.php?id=10&page=4[/li]
[li]http://www.jouwsite.nl/tutorials.php?id=10[/li]
Van de onderste url zouden we voorbeeld 4 kunnen gebruiken, maar voor de andere twee moeten we nog 2 RewriteRules toepassen.
Voorbeeld 5: Meerdere GET variabelen
Je ziet dat ik het lijstje met urls niet voor niets in die volgorde heb geplaatst, zo komen ze namelijk ook in de .htaccess te staan. Zorg er altijd voor dat je eerst de regel van de url met de meeste GET variabelen plaatst en dan pas regels voor urls met minder GET variabelen. De url met veel GET variabelen voldoet namelijk ook aan de reguliere expressie voor eentje met minder variabelen en zo voorkom je dus dat de verkeerde RewriteRule uitgevoerd wordt.
Wat er in dit voorbeeld gebeurt, is dat Apache door de regels zal gaan lopen en zodra er een regel is waaraan de url matched, zal de regel uitgevoerd worden. Vervolgens zal apache verder gaan naar de volgende regels. In de reguliere expressies zien we telkens (.*) staan, dit is een uitdrukking die alle tekens matched. Verder zien we in het laatste gedeelte van de regel $1, $2 en $3 staan. Deze uitdrukkingen verwijzen naar respectievelijk het eerste, tweede en derde voorkomen van (.*) in de reguliere expressie.
Een puntje waar we wel even op moeten letten, zijn de urls waarmee we onze website nu aanroepen. Je ziet dat de urls in alle reguliere expressies eindigen met een /. Dat betekent dus ook dat we alle links op onze website die naar zo'n pagina verwijzen, met een / moeten laten eindigen. Doe je dit niet, dan zul je een foutmelding krijgen dat de pagina niet gevonden kan worden. Verderop in deze tutorial in het gedeelte over FLAGS, zullen we nog een andere oplossing voor dit probleem zien.
Dit is eigenlijk alles omtrent het maken van zoekmachine vriendelijke urls. We zien dat het handig is om van tevoren al na te denken over alle GET variabelen die we in een url gebruiken.
Wat zijn zoekmachine vriendelijke urls nu eigenlijk? Dat is een vraag die ik allereerst eens zal beantwoorden aan de hand van een voorbeeld. We zijn allemaal wel eens urls van het volgende type tegen gekomen:
http://www.jouwsite.nl/tutorials.php?id=10&page=4&replies=20
De zoekmachine vriendelijke variant van deze url zou als volgt kunnen zijn:
http://www.jouwsite.nl/tutorials/10/4/20/
Dat ziet er al een stuk beter uit nietwaar? En naast dat ze er een stuk beter uitzien, hebben deze urls ook nog als voorbeeld dat deze te begrijpen zijn door zoekmachine bots. Daardoor kan de content van je hele site geindexeerd worden en blijven ze niet op de index pagina steken.
Dit alles is mogelijke met de mod_rewrite module. Laten we om te beginnen eerst eens naar een eenvouiger voorbeeld kijken.
Voorbeeld 4: Zoekmachine vriendelijke url
RewriteEngine On
RewriteBase /
RewriteRule ^tutorials/(.*)/$ tutorials.php?id=$1
In dit voorbeeld wordt bijvoorbeeld de url 'http://www.jouwsite.nl/tutorials/12/'; omgeschreven naar 'http://www.jouwsite.nl/tutorials.php?id=12';. We hoeven nu niet meer de naam van de GET variabele id in de url op te nemen, het is genoeg om alle het id daar te plaatsen.
Hoe gaat dat nu als we meerdere GET variabelen hebben? Stel dat we de van de volgende urls allemaal zoekmachine vriendelijke urls zouden willen hebben:
[li]http://www.jouwsite.nl/tutorials.php?id=10&page=4&replies=20[/li]
[li]http://www.jouwsite.nl/tutorials.php?id=10&page=4[/li]
[li]http://www.jouwsite.nl/tutorials.php?id=10[/li]
Van de onderste url zouden we voorbeeld 4 kunnen gebruiken, maar voor de andere twee moeten we nog 2 RewriteRules toepassen.
Voorbeeld 5: Meerdere GET variabelen
RewriteEngine On
RewriteBase /
RewriteRule ^tutorials/(.*)/(.*)/(.*)/$ tutorials.php?id=$1&page=$2&replies=$3
RewriteRule ^tutorials/(.*)/(.*)/$ tutorials.php?id=$1&page=$2
RewriteRule ^tutorials/(.*)/$ tutorials.php?id=$1
Je ziet dat ik het lijstje met urls niet voor niets in die volgorde heb geplaatst, zo komen ze namelijk ook in de .htaccess te staan. Zorg er altijd voor dat je eerst de regel van de url met de meeste GET variabelen plaatst en dan pas regels voor urls met minder GET variabelen. De url met veel GET variabelen voldoet namelijk ook aan de reguliere expressie voor eentje met minder variabelen en zo voorkom je dus dat de verkeerde RewriteRule uitgevoerd wordt.
Wat er in dit voorbeeld gebeurt, is dat Apache door de regels zal gaan lopen en zodra er een regel is waaraan de url matched, zal de regel uitgevoerd worden. Vervolgens zal apache verder gaan naar de volgende regels. In de reguliere expressies zien we telkens (.*) staan, dit is een uitdrukking die alle tekens matched. Verder zien we in het laatste gedeelte van de regel $1, $2 en $3 staan. Deze uitdrukkingen verwijzen naar respectievelijk het eerste, tweede en derde voorkomen van (.*) in de reguliere expressie.
Een puntje waar we wel even op moeten letten, zijn de urls waarmee we onze website nu aanroepen. Je ziet dat de urls in alle reguliere expressies eindigen met een /. Dat betekent dus ook dat we alle links op onze website die naar zo'n pagina verwijzen, met een / moeten laten eindigen. Doe je dit niet, dan zul je een foutmelding krijgen dat de pagina niet gevonden kan worden. Verderop in deze tutorial in het gedeelte over FLAGS, zullen we nog een andere oplossing voor dit probleem zien.
Dit is eigenlijk alles omtrent het maken van zoekmachine vriendelijke urls. We zien dat het handig is om van tevoren al na te denken over alle GET variabelen die we in een url gebruiken.
Pagina 5
Flags in een RewriteRule
Op de voorgaande pagina hebben we voorbeelden gezien van een RewriteRule met twee parameters. Er is echter nog een derde optionele parameter die we kunnen toevoegen. De flags die we hiervoor kunnen gebruiken, zorgen ervoor dat de RewriteRule iets anders zal werken.
Allereerst maar eens een overzicht met de belangrijkste:
[li][R] - Redirect een url zichtbaar[/li]
[li][F] - Forceert geen toegang tot een url (403 foutmelding)[/li]
[li][L] - Laatste regel. Gebruik dit voor elke regel die niet met een ander verbonden is.[/li]
[li][NC] - Maak de regel niet hoofdlettergevoelig[/li]
Een volledig overzicht van alle flags vind je ook op de Mod Rewrite Cheat Sheet:

De werking van deze flags spreekt redelijk voor zich. De actie behorende bij een flag wordt alleen uitgevoerd als de regel waartoe die flag behoort uitgevoerd wordt.
Voorbeeld 6: Een pagina zichtbaar doorverwijzen
Dit voorbeeldje is bijna hetzelfde als voorbeeld 2. Alleen de werking zal iets anders zijn doordat we de [R] flag toegevoegd hebben. Wederom zal de inhoud van nieuw.php getoond worden, maar nu zien we ook dat nieuw.php in de url weergegeven wordt. Kortom, de gebruiker is dus echt doorverwezen naar een andere pagina.
Voorbeeld 7: Pagina bekijken verbieden
Met deze regel is het onmogelijk voor gebruikers om ons .htaccess bestand te bekijken. Ditzelfde kun je natuurlijk met allerlei andere bestanden doen.
Voorbeeld 8: RewriteEngine stoppen na uitvoeren regel
Zo zou het voorbeeld van de vorige pagina er eigenlijk uit moeten zien. Als immers aan de eerste regel voldaan is, hoeven de regels daaronder niet meer uitgevoerd te worden. Om dat te voorkomen voegen we de [L] flag toe.
Voorbeeld 9a: Toevoegen van ontbrekende /
Op deze manier wordt aan een url als http://www.jouwsite.nl/tutorials/10, die normaal gesproken een 'pagina niet gevonden' foutmelding zou geven, eerst een / toegevoegd. Nadat dat gedaan is wordt de volgende regel uitgevoerd en de url dus wel op een juiste manier geinterpreteerd.
Een andere oplossing voor dit probleem is het gebruik van het ? uit de reguliere expressie syntax. Dit teken houdt in dat het voorgaande teken 0 of 1 keer mag voorkomen. De RewriteRule ziet er dan als volgt uit.
Voorbeeld 9b: Toevoegen van ontbrekende / (2)
Deze code voegt de / niet daadwerkelijk toe, maar interpreteert de url goed ongeacht of de laatste / er nu wel of niet staat.
Allereerst maar eens een overzicht met de belangrijkste:
[li][R] - Redirect een url zichtbaar[/li]
[li][F] - Forceert geen toegang tot een url (403 foutmelding)[/li]
[li][L] - Laatste regel. Gebruik dit voor elke regel die niet met een ander verbonden is.[/li]
[li][NC] - Maak de regel niet hoofdlettergevoelig[/li]
Een volledig overzicht van alle flags vind je ook op de Mod Rewrite Cheat Sheet:

De werking van deze flags spreekt redelijk voor zich. De actie behorende bij een flag wordt alleen uitgevoerd als de regel waartoe die flag behoort uitgevoerd wordt.
Voorbeeld 6: Een pagina zichtbaar doorverwijzen
RewriteEngine On
RewriteBase /
RewriteRule oud.php nieuw.php [R]
Dit voorbeeldje is bijna hetzelfde als voorbeeld 2. Alleen de werking zal iets anders zijn doordat we de [R] flag toegevoegd hebben. Wederom zal de inhoud van nieuw.php getoond worden, maar nu zien we ook dat nieuw.php in de url weergegeven wordt. Kortom, de gebruiker is dus echt doorverwezen naar een andere pagina.
Voorbeeld 7: Pagina bekijken verbieden
RewriteEngine On
RewriteBase /
RewriteRule ^\.htaccess$ .htaccess [F]
Met deze regel is het onmogelijk voor gebruikers om ons .htaccess bestand te bekijken. Ditzelfde kun je natuurlijk met allerlei andere bestanden doen.
Voorbeeld 8: RewriteEngine stoppen na uitvoeren regel
RewriteEngine On
RewriteBase /
RewriteRule ^tutorials/(.*)/(.*)/(.*)/$ tutorials.php?id=$1&page=$2&replies=$3 [L]
RewriteRule ^tutorials/(.*)/(.*)/$ tutorials.php?id=$1&page=$2 [L]
RewriteRule ^tutorials/(.*)/$ tutorials.php?id=$1 [L]
Zo zou het voorbeeld van de vorige pagina er eigenlijk uit moeten zien. Als immers aan de eerste regel voldaan is, hoeven de regels daaronder niet meer uitgevoerd te worden. Om dat te voorkomen voegen we de [L] flag toe.
Voorbeeld 9a: Toevoegen van ontbrekende /
RewriteEngine On
RewriteBase /
RewriteRule ^tutorials/(.*)$ tutorials/$1/ [R]
RewriteRule ^tutorials/(.*)/$ tutorials.php?id=$1 [L]
Op deze manier wordt aan een url als http://www.jouwsite.nl/tutorials/10, die normaal gesproken een 'pagina niet gevonden' foutmelding zou geven, eerst een / toegevoegd. Nadat dat gedaan is wordt de volgende regel uitgevoerd en de url dus wel op een juiste manier geinterpreteerd.
Een andere oplossing voor dit probleem is het gebruik van het ? uit de reguliere expressie syntax. Dit teken houdt in dat het voorgaande teken 0 of 1 keer mag voorkomen. De RewriteRule ziet er dan als volgt uit.
Voorbeeld 9b: Toevoegen van ontbrekende / (2)
RewriteEngine On
RewriteBase /
RewriteRule ^tutorials/(.*)/?$ tutorials.php?id=$1 [L]
Deze code voegt de / niet daadwerkelijk toe, maar interpreteert de url goed ongeacht of de laatste / er nu wel of niet staat.
Pagina 6
Voorwaarden stellen met RewriteCond
Naast het gebruik van een RewriteRule zoals ik op voorgaande pagina's heb laten zien, kunnen we ook nog voorwaarden stellen aan een RewriteRule. Hier gebruiken we dan een RewriteCond voor.
Deze methode zou je bijvoorbeeld kunnen gebruiken om bezoekers door te sturen afhankelijk van de domeinnaam of bijvoorbeeld gebruikte browser. Ook kun je een bezoeker doorsturen naar een bepaalde directory en kun je voorkomen dat anderen direct naar plaatjes op jouw server linken (hotlinking).
Aan de RewriteCond kun je een tweetal flags meegeven. [NC] maakt de conditie hoofdletter ongevoelig en [OR] om meerdere condities te combineren. Daarnaast zijn er een groot aantal variabelen die je voor de condities kunt gebruiken.
Enkele voorbeelden daarvan zijn:
[li]HTTP_USER_AGENT[/li]
[li]HTTP_REFERER[/li]
[li]HTTP_HOST[/li]
[li]REMOTE_ADDR[/li]
[li]REQUEST_URI[/li]
Een volledige lijst met variabelen vind je onder andere op de Mod Rewrite Cheat Sheet:

Voorbeeld 10: Gebruiker afhankelijke van domein doorsturen
Het volgorde van controleren van Apache is iets waar je even bij stil moet staan. Allereerst worden de RewriteRules getest op matches. Als dat positief is wordt er gekeken of er RewriteConds bij die RewriteRule horen en eventueel worden deze ook gecheckt. Pas als ook dat positief is zal de RewriteRule uitgevoerd worden. In alle andere gevallen zal Apache doorgaan naar de volgende RewriteRule.
In bovenstaand voorbeeld zou een url als http://jouwsite.nl/pagina.php voldoen aan de RewriteRule. Ook de RewriteCond is postief omdat de url niet in het jusite formaat staat en dus zal de RewriteRule uitgevoerd worden. Door de [R] flag zal de gebruiker dus doorgestuurd worden naar http://www.jouwsite.nl/pagina.php.
Voorbeeld 11: Urls doorsturen naar een andere directory
In dit voorbeeld zal als aan het eerste gedeelte van de RewriteRule voldaan wordt een tweetal condities gecheckt worden. Allereerst wordt gecontroleerd of de HTTP_HOST gelijk is aan www.jouwsite.nl en vervolgens of het begin van de REQUEST_URI niet gelijk is aan /site/. Als dat zo is, wordt de gebruiker doorgestuurd naar de directory /site/.
Voorbeeld 12: Lokale gebruiker naar de online site sturen
Als in dit geval blijkt dat de bezoeker de site lokaal probeert te bezoeken, wordt hij naar de online variant gestuurt. Dat een bezoeker lokaal werkt blijkt uit een HTTP_HOST die gelijk is aan 'localhost' of een ip-adres dat gelijk is aan 127.0.0.1.
Voorbeeld 13: Voorkomen van hotlinking
Bezoekers worden naar de beginpagina van je site gestuurd als de hyperlink niet afkomstig is van http://jouwsite.nl, http://www.jouwsite.nl of van http://123.123.123.123. Als dit namelijk het geval is, weet je dat je te maken hebt met iemand die bestanden van jouw server op zijn site wil laten zien.
Deze methode zou je bijvoorbeeld kunnen gebruiken om bezoekers door te sturen afhankelijk van de domeinnaam of bijvoorbeeld gebruikte browser. Ook kun je een bezoeker doorsturen naar een bepaalde directory en kun je voorkomen dat anderen direct naar plaatjes op jouw server linken (hotlinking).
Aan de RewriteCond kun je een tweetal flags meegeven. [NC] maakt de conditie hoofdletter ongevoelig en [OR] om meerdere condities te combineren. Daarnaast zijn er een groot aantal variabelen die je voor de condities kunt gebruiken.
Enkele voorbeelden daarvan zijn:
[li]HTTP_USER_AGENT[/li]
[li]HTTP_REFERER[/li]
[li]HTTP_HOST[/li]
[li]REMOTE_ADDR[/li]
[li]REQUEST_URI[/li]
Een volledige lijst met variabelen vind je onder andere op de Mod Rewrite Cheat Sheet:

Voorbeeld 10: Gebruiker afhankelijke van domein doorsturen
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www.jouwsite.nl$ [NC]
RewriteRule ^(.*)$ http://www.jouwsite.nl/$1 [R,L]
Het volgorde van controleren van Apache is iets waar je even bij stil moet staan. Allereerst worden de RewriteRules getest op matches. Als dat positief is wordt er gekeken of er RewriteConds bij die RewriteRule horen en eventueel worden deze ook gecheckt. Pas als ook dat positief is zal de RewriteRule uitgevoerd worden. In alle andere gevallen zal Apache doorgaan naar de volgende RewriteRule.
In bovenstaand voorbeeld zou een url als http://jouwsite.nl/pagina.php voldoen aan de RewriteRule. Ook de RewriteCond is postief omdat de url niet in het jusite formaat staat en dus zal de RewriteRule uitgevoerd worden. Door de [R] flag zal de gebruiker dus doorgestuurd worden naar http://www.jouwsite.nl/pagina.php.
Voorbeeld 11: Urls doorsturen naar een andere directory
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_POST} ^www.jouwsite.nl$ [NC]
RewriteCond %{REQUEST_URI} !^/site/ [NC]
RewriteRule ^(.*)$ /site/$1 [R,L]
In dit voorbeeld zal als aan het eerste gedeelte van de RewriteRule voldaan wordt een tweetal condities gecheckt worden. Allereerst wordt gecontroleerd of de HTTP_HOST gelijk is aan www.jouwsite.nl en vervolgens of het begin van de REQUEST_URI niet gelijk is aan /site/. Als dat zo is, wordt de gebruiker doorgestuurd naar de directory /site/.
Voorbeeld 12: Lokale gebruiker naar de online site sturen
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^localhost$ [OR,NC]
RewriteCond %{REMOTE_ADDR} ^127.0.0.1$ [NC]
RewriteRule ^(.*)$ http://www.jouwsite.nl/$1 [R,L]
Als in dit geval blijkt dat de bezoeker de site lokaal probeert te bezoeken, wordt hij naar de online variant gestuurt. Dat een bezoeker lokaal werkt blijkt uit een HTTP_HOST die gelijk is aan 'localhost' of een ip-adres dat gelijk is aan 127.0.0.1.
Voorbeeld 13: Voorkomen van hotlinking
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !^http://jouwsite.nl$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.jouwsite.nl$ [NC]
RewriteCond %{HTTP_REFERER} !^http://123.123.123.123$ [NC]
RewriteRule ^.*$ http://www.jouwsite.nl/ [R,L]
Bezoekers worden naar de beginpagina van je site gestuurd als de hyperlink niet afkomstig is van http://jouwsite.nl, http://www.jouwsite.nl of van http://123.123.123.123. Als dit namelijk het geval is, weet je dat je te maken hebt met iemand die bestanden van jouw server op zijn site wil laten zien.
Pagina 7
Slotwoord en referenties
Tot zover deze tutorial over het gebruik van de mod_rewrite module van Apache. Ik heb geprobeerd uitgebreid in te gaan op de functionaliteit en werking van deze module.
Als je gebruik wilt maken van deze methode om zoekmachine vriendelijke urls te maken, kan ik alleen maar aanraden om van tevoren al te bedenken hoe de structuur van je site eruit komt te zien. Want zoals we gezien hebben in de tutorial kun je anders wel eens lelijk in de war raken met de GET variabelen die je in de url hebt staan.
Er zijn nog veel meer mogelijkheden en toepassingen van deze module. Vooral op het gebied van de flags heb ik nog lang niet alles behandeld. Kijk daarom eens op onderstaande links voor meer informatie over alle te gebruiken flags en andere voorbeelden van het gebruik van deze module.
Vragen, opmerkingen en reacties op deze tutorial zijn natuurlijk altijd welkom.
Deze tutorial is ook hier te vinden.
Bronvermelding
[li]Easy Mod Rewrite[/li]
[li]A Beginnersguide to URL Rewriting[/li]
[li]URL Rewriting Guide[/li]
[li]Mod Rewrite Cheat Sheet[/li]
Links
[li]Mod Rewrite Overview[/li]
[li]URL Rewrite Guide[/li]
Als je gebruik wilt maken van deze methode om zoekmachine vriendelijke urls te maken, kan ik alleen maar aanraden om van tevoren al te bedenken hoe de structuur van je site eruit komt te zien. Want zoals we gezien hebben in de tutorial kun je anders wel eens lelijk in de war raken met de GET variabelen die je in de url hebt staan.
Er zijn nog veel meer mogelijkheden en toepassingen van deze module. Vooral op het gebied van de flags heb ik nog lang niet alles behandeld. Kijk daarom eens op onderstaande links voor meer informatie over alle te gebruiken flags en andere voorbeelden van het gebruik van deze module.
Vragen, opmerkingen en reacties op deze tutorial zijn natuurlijk altijd welkom.
Deze tutorial is ook hier te vinden.
Bronvermelding
[li]Easy Mod Rewrite[/li]
[li]A Beginnersguide to URL Rewriting[/li]
[li]URL Rewriting Guide[/li]
[li]Mod Rewrite Cheat Sheet[/li]
Links
[li]Mod Rewrite Overview[/li]
[li]URL Rewrite Guide[/li]
Reacties
0