Mod Rewrite

  1. Inleiding
  2. Vereiste instellingen
  3. Basis van Mod Rewrite
  4. Zoekmachine vriendelijke urls
  5. Flags in een RewriteRule
  6. Voorwaarden stellen met RewriteCond
  7. Slotwoord en referenties
  8. Reacties op deze tutorial

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:

  • HTTP_USER_AGENT
  • HTTP_REFERER
  • HTTP_HOST
  • REMOTE_ADDR
  • REQUEST_URI


Een volledige lijst met variabelen vind je onder andere op de Mod Rewrite Cheat Sheet:
Afbeelding

Voorbeeld 10: Gebruiker afhankelijke van domein doorsturen
Code
1
2
3
4
5
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
Code
1
2
3
4
5
6
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
Code
1
2
3
4
5
6
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
Code
1
2
3
4
5
6
7
8
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.

Voorbeeld 14: Bestaande bestanden of mappen
Code
1
2
3
4
5
6
7
8
9
RewriteEngine On
RewriteBase /

# Bestaande bestanden of mappen uitsluiten
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.*?)$ $1 [L]

# Overige RewriteRules onder deze regel

Bij het werken met nette urls zul je wellicht tegen het probleem aanlopen dat je externe CSS stylesheet of Javascript bestanden niet meer goed geladen worden. De reden hiervoor is dat de url naar deze bestanden ook herschreven wordt, iets dat we dus moeten zien te voorkomen.

Door bovenstaande regels op te nemen in je .htaccess bestand voorkom je dat de overige RewriteRules uitgevoerd worden als de url naar een bestaand bestand of bestaande map verwijst.

Vorige Volgende