Voorbeelden veel gebruikte .htaccess regels

Een tijdje terug heb ik al eens over de kracht van reguliere expressies in Google Analytics filters geschreven. Maar naast het gebruik van reguliere expressies in GA kun je ze ook nog ergens anders gebruiken: in de .htaccess op je server.

Het .htaccess bestand staat vaak in de root van je server (bij Apache tenminste) en is bedoeld om een aantal instellingen van een folder aan te kunnen passen. Wanneer hij gebruikt wordt in de root kun je de instellingen van alle subfolders aanpassen. Veel van deze instellingen hebben te maken met het afhandelen van binnenkomend verkeer.

Ik wil hieronder een aantal voorbeelden plaatsen van .htaccess regels die veel gebruikt worden. En waarom: omdat ik ze niet uit mijn hoofd ken en ergens een plek wil hebben waar ik ze weg kan knippen en plakken 😉

Voordat een aantal zaken gerewrite worden moeten eerst wat algemenere zaken aangepakt worden:

Bepaalde IP nummers de toegang ontzeggen
Heb je een IP nummer die veel traffic genereert omdat er een soort bot op draait? Blokkeer hem simpel met de volgende regels:
order deny,allow
deny from 12.34.56.78
deny from 78.56.34.12
allow from all

Vanwege de order die ingesteld is worden eerst alle deny's uitgevoerd en dan pas de allows. Zo worden de betreffende IP nummers de toegang ontzegd en kan de rest verder.

Toegang tot de .htaccess ontzeggen
Het kan voorkomen dat men graag wil weten wat er allemaal in je .htacces staat. Om dat te voorkomen plaats je het volgende script:
<Files .htaccess>
order allow,deny
deny from all
</Files>

Deze regels gelden specifiek voor het .htaccess bestand. Op dezelfde manier kunnen ook andere bestanden en folders beschermd worden.

Definieer het index bestand
Wanneer de root of een specifieke folder opgevraagd wordt zal de server gaan zoeken naar het index bestand. Dat is het bestand welke getoond moet worden als er geen bestand gedefinieerd is. Voorbeeld: www.bla.nl/folder/. Over het algemeen staan in de meeste servers de volgende bestanden ingesteld: index.html, index.htm, default.asp (IIS), index.php (Apache). Maar mocht je het aan willen passen:

DirectoryIndex willekeurig.html

Aangepaste foutmeldingen
Veel servers hebben voor veel voorkomende foutmeldingen redelijk waardeloze pagina's ingesteld. Dit moet je veranderen naar de look-en-feel van de site, lees als voorbeeld het goede artikel van Karel Geenen over een eigen 404. Om je zelfgemaakte pagina in te stellen gebruik je de volgende code:

ErrorDocument 403 /fouten/geen-toegang.html
ErrorDocument 404 /fouten/niet-gevonden.html

Basic redirects
Er is een mogelijkheid in de .htaccess om een paar basic redirects in te stellen. Hier kun je geen voorwaarden aan verbinden en je kunt ook geen reguliere expressies gebruiken. Deze zien er als volgt uit:

Redirect 301 /oudebestand.php http://www.voorbeeld.nl/nieuwemap/nieuwebestand.php

Let op dat het tweede adres een volledig adres is, anders werkt het niet. De 301 is de redirect code voor een permanente redirect.

De rewrite engine aan zetten

De basis instellingen zijn gedaan, dan kan nu de rewrite engine aangezet worden om met rewrite regels het inkomende verkeer te begeleiden. Deze regels geven je de mogelijkheid om op basis van enkele gegevens (hostnaam, referer, bestandsnaam, querystring, methode) een rewrite/redirect te doen. Om de engine aan te zetten gebruik je dit:

RewriteEngine on

Eén hostnaam voor je site
Om diverse SEO redenen wil je je site maar op 1 hostnaam beschikbaar hebben. Hierdoor ontstaat er geen duplicate content probleem omdat je site op domein A en domein B geïndexeerd word. Ook wil je niet dat je site op zowel www.site.nl en site.nl geïndexeerd word. Om dit alles te voorkomen plaats je de volgende regels:

RewriteCond %{HTTP_HOST} !^www\.voorbeeld\.nl [NC]
RewriteRule ^(.*)$ http://www\.voorbeeld\.nl/$1 [L,R=301]

Hiermee zegt je eigenlijk: als de hostnaam niet (de uitroepteken staat voor: niet) www.voorbeeld.nl is dan moet er een 301 redirect gedaan worden naar www.voorbeeld.nl. Met een paar extra instellingen als [NC] zeg je dat de case (hoofdletters/kleine letters) genegeerd kunnen worden. Met [L] zeg je dat deze laatste regel direct uitgevoerd moet worden. En met de [R=301] zeg je dat het geen rewrite maar een redirect moet zijn van het type 301 (permanent).

Oude domein / website redirecten
Met bovengenoemde regels kun je de redirect alleen uitvoeren als het oude domein aan de nieuwe server gekoppeld word in de DNS. Hierdoor zullen alle verzoeken op 1 server afgehandeld kunnen worden. Wanneer dit niet kan zul je de redirect op de oude server moeten plaatsen, en die kan er als volgt uit zien:

RewriteRule ^(.*)$ http://www\.nieuwesite\.nl/$1 [L,R=301]

Extreme traffic redirecten
Het kan natuurlijk voorkomen dat je op een site gelinkt wordt waar je niet echt blij mee bent. Het kost enorm veel dataverkeer en de bezoekers zijn waardeloos. Plaats dan een aantal regels om al dit verkeer subtiel door te sturen:

RewriteCond %{HTTP_REFERER} grotesite\.nl [NC]
RewriteRule ^(.*)$ http://www.google.nl [L,R=302]

Bezoekers die dan vanaf de grote site naar jouw site gaan zullen doorgestuurd worden naar Google. Dit kan net het verschil zijn tussen plat gaan en online blijven.

Rewrite alles behalve...
In veel gevallen wordt de rewrite engine gebruikt om zogenaamde nette url's achter de schermen te herschrijven naar 1 bestand die alles afhandelt. Zo kun je het adres /map/map2/bestand/ intern rewriten naar index.php?map/map2/bestand/:

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

Hieraan kun je weer bepaalde voorwaarden verbinden: rewrite alle url's tenzij het een bestaande map of bestand is. Dit kun je gebruiken om links naar bijvoorbeeld PDF bestanden niet te laten herschrijven maar gewoon te negeren:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?$1 [L]

Rewrite een bepaalde folder
Ook kun je 1 bepaalde folder redirecten of rewriten. Je beperkt met een conditie dan de regel tot 1 folder:

RewriteCond %{REQUEST_URI} ^/deze_map/ [NC]
RewriteRule ^(.*)$ /index_voor_map.php?$1 [L]

en als aanvulling heb je nog de volgende 2 regels:

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} !^/nog_een_map/

Deze regels zeggen dat de request methode GET moet zijn (hier kun je natuurlijk ook POST gebruiken) en dat de folder /nog_een_map/ genegeerd kan worden. Let hierbij op de uitroepteken die dus 'niet' betekent.

Meerdere condities
Wanneer je meerdere condities wil gebruiken kun je ze kopellen met de OR:

RewriteCond %{REQUEST_URI} ^/map1/$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/map2/$ [NC]

Tool
Omdat een fout snel gemaakt is en het testen op een webserver omslachtig kan zijn raad ik aan een regexp checker te gebruiken waarin je on-the-fly je expressie kunt testen. Ik gebruik momenteel The Regexp Coach naar volle tevredenheid.

Tot slot

Ik heb een aantal basis redirect en rewrite regels uitgelegd welke je kunt uitbreiden en combineren waar mogelijk. Veel zaken kunnen hiermee afgehandeld worden. Natuurlijk sta ik open voor suggesties en aanvullingen, ook als je vragen hebt of ergens niet uit komt: drop het in de comments zodat ik het artikel aan kan vullen.

Naast de genoemde zaken kun je nog veel verder gaan in het rewriten. Reguliere expressies zijn verschrikkelijk krachtig en kunnen je veel werk uit handen nemen.

Click to activate social bookmarks