Proeven aan .htaccess

Erik-Jan Bulthuis

10 december 2006

Even Google’n op .htaccess levert honderdduizenden voorbeeld scriptjes op. De scriptjes gaan over het herschrijven van URL’s, het blokkeren van de toegang van bepaalde IP-adressen tot je site, het maken van je eigen error pagina’s enz. Op zich werken deze codes vaak prima en zijn ze snel te herschrijven tot jouw concrete situaties. Het nadeel is echter dat áls er fouten optreden, je niet weet wat te doen. Ook ken je niet de volledige mogelijkheden van .htaccess en zie je mogelijke nuttige toepassingen niet. Daarom zullen we in dit artikel de basis van .htaccess eens uitgebreid bespreken.

Wat is .htaccess?

.htaccess is een manier om de webserver Apache te configureren. Er moet dan ook geconcludeerd worden dat we vóór de vraag “wat is .htaccess?” de vraag “wat is Apache?” moeten beantwoorden.

Wat is Apache?

De Apache httpd server is een webserver die vaak gebruikt wordt in combinatie in het zogenaamde LAMP pakket: Linux, Apache, MySQL en PHP. Apache draait ook wel onder andere operating systems maar Linux en Apache is de meest gebruikte combinatie. De eerste versie van Apache werd ontwikkeld in 1995. Al een jaar of 10 is het de meest gebruikte server op het internet. Momenteel wordt het onderhoud aan de software door ongeveer 20 vrijwilligers uitgevoerd. Apache is Open Source software.

Hoe configureer je Apache?

Apache heeft enkele configuratiebestanden waarin de werking van de server kan worden beinvloedt. Omdat Apache op een server wordt geïnstalleerd, hebben alle sites op die server dezelfde configuratie. Dit is in een aantal gevallen niet wenselijk/handig. Daarom is het mogelijk om in de configuratiebestanden voor één site een afwijkende configuratie neer te zetten. Dit doe je zo:


Options Include

Configuratie op directory niveau

Als je server echter door meerdere sites van verschillende eigenaren wordt bewoond, is het niet veilig/handig om al deze mensen de rechten te geven om de hoofd configuratiebestanden te wijzigen. Het zou makkelijker zijn als de eigenaar van een site in zijn eigen mappenstructuur de nieuwe configuratie kan aangeven. Dit is nu precies waar .htaccess voor is bedoelt. .htaccess stelt je in staat om per directory de serverinstellingen te wijzigen. Uiteraard wil je in de meeste gevallen niet dat de websites alle instellingen van de server kunnen aanpassen. Hiertoe kun je in de hoofd configuratiebestanden via AllowOverride aangeven welke instellingen overschreven (=override) mogen worden door een .htaccess file. Een geldige declaratie is bijvoorbeeld:

AllowOverride AuthConfig Indexes

Zoals je ziet is het mogelijk om meerdere zgn. directives aan te geven die gewijzigd mogen worden door de .htaccess. Als je wilt dat de gebruikers helemaal geen .htaccess mogen gebruiken, kun je AllowOverride None gebruiken. De volgende directives zijn beschikbaar:

  • AuthConfig
    Maakt het gebruik van authorisatietoepassingen mogelijk, zoals een loginbox.
  • FileInfo
    Maakt het mogelijk om instellingen van bestanden te wijzigen.
  • Indexes
    Maakt het mogelijk om directories te beheren, zoals het wel of niet tonen van een lijst met bestanden in een directory zonder index.*.
  • Limit
    Maakt het mogelijk om bepaalde gebruikers de toegang tot een directory te ontzeggen.
  • Options
    Maakt het gebruik van bepaalde directory features mogelijk.

Hiërarchie van configureren

Het zal logisch klinken dat als een .htaccess en de hoofd configuratiebestanden iets anders zeggen over een bepaalde instelling, de .htaccess ‘wint’. Immers, met .htaccess overschrijven we de hoofd configuratie. .htaccess heeft niet alleen gevolgen voor de directory waar het in staat, maar ook voor de onderliggende subdirectories. Op dezelfde manier als net is het verklaarbaar dat een .htaccess configuratie in de map /map1/map2 de eventueel aanwezige .htaccess configuratie in de map /map1 overschrijft.

.htaccess files aanmaken

Een .htaccess file is een naamloze file met een extensie “htaccess”. De meeste FTP programma’s kunnen dit bestand standaard niet zien, al is dit vaak wel aan te passen binnen de instellingen van je FTP programma. Een altijd handige manier om toch een FTP file te plaatsen, is de file eerst op te slaan als htaccess.txt, deze te uploaden en daarna te renamen tot .htaccess.

Toepassingen

Om de lezer die tot hier is gekomen te belonen, zullen we nu toch enkele concrete voorbeelden langslopen. Hierbij gaat het niet om de volledigheid van de voorbeelden, maar we proberen een klein stukje van de mogelijkheden van .htaccess te laten zien.

Directories beveiligen

Als je een bepaalde directory hebt die alleen bepaalde mensen mogen zien, kun je deze beveiligen met een gebruikersnaam en wachtwoord. Dit kan ook geregeld worden via een .htaccess bestandje in die directory. De inhoud van dat bestand ziet er als volgt uit:

AuthUserFile /usr/www/httpdocs/example/.htpasswd
AuthGroupFile /dev/null
AuthName "Beveiligd gedeelte"
AuthType Basic

require valid-user

Achter AuthName staat de titel van het loginschermpje wat je krijgt als je je tot deze directory went. Verder wordt er in de eerste regel verwezen naar de locatie van een file met de naam .htpasswd. Hierin staat de user/pass combinaties die toegang verlenen tot de directory. Er zijn online meer dan genoeg tools beschikbaar om een .htpasswd te maken. Ik verwijs naar een willekeurige.

Toegang verlenen/blokkeren

Enige tijd geleden vroeg Yorian op het forum of het mogelijk was dat alle IP-adressen op één na voor een bepaalde directory werden doorgestuurd naar een andere site. Dit zou je bijvoorbeeld willen als je een site aan het bouwen bent welke nog niet publiekelijk toegankelijk gemaakt mag worden, maar als je zelf natuurlijk wel de site wilt bekijken. De gegeven oplossing was:

RewriteEngine on

RewriteCond %{REMOTE_ADDR} !^24.132.253.25$
RewriteRule .* http://netters.nl

Met RewriteEngine on laten we Apache weten dat we van plan zijn bepaalde hits te redirecten naar een andere URL. Vervolgens hebben we een conditie en een regel. De conditie zegt dat als het IP adres niet gelijk is aan 24.132.253.25, de regel actief wordt. De regel zorgt voor een forward naar http://netters.nl. Voor meer info over redirecten, zie mod_rewrite.

IP ban

Stel je hebt een gebruiker (of bot) op je site die constant de meeste vervuilende spam op je site gooit. Je collega-hamsterliefhebbers hebben echt geen behoefte aan Viagra, maar worden er op het forum geregeld mee geconfronteerd. Als je dan het IP adres van de boosdoener vindt, zou je deze graag de toegang tot je site willen ontzeggen. Dit kan erg makkelijk via het volgende .htaccess bestandje:

Order Deny,Allow
Deny from 12.34.56.7

Hierbij is 12.34.56.7 het IP adres wat geband wordt.

Eigen error documenten

Het is erg chic om een niet gevonden pagina op je site te laten doorsturen naar een mooie overzichtpagina (bijvoorbeeld je sitemap of de pagina waar je zoekmachine op staat). Helaas is je server dusdanig ingesteld dat je bij een opgevraagde niet bestaande pagina een gruwelijk lelijke 404 error pagina krijgt. Via .htaccess kun je error codes doorsturen naar een door jouw ontworpen pagina. Dat kan als volgt:

ErrorDocument 403 /errors/error403.php
ErrorDocument 404 /errors/error404.php

Hieronder een beperkte lijst van mogelijke error codes en hun betekenis:

Code Omschrijving
400 Verkeerde syntax
401 Niet geauthoriseerd
402 Niet in gebruik
403 Verboden toegang
404 Bestand niet gevonden
500 Interne Server Fout
501 Niet geïmplenteerd
502 Server Overbelast
503 Gateway Timeout

Bijkomend voordeel is dat je de door jouw gemaakt error documenten gegevens over de broken link kan opslaan in een database. Dit helpt je uiteraard bij het debuggen van je site.

Rewrite URL’s

Via .htaccess kun je URL’s redirecten. Zo kun je bijvoorbeeld clean URL’s hebben als www.site.nl/nieuws terwijl de hele map /nieuws niet eens bestaat. Dit is echter een redelijk complex gebeuren wat we hier niet zullen uitwerken. Wellicht in een later artikel wel.

Hotlinken tegengaan

Stel je maakt een site voor een fotograaf. Op die site komen natuurlijk veel foto’s te staan, maar je wilt niet dat andere mensen rechtstreeks jouw foto’s op hun site plaatsen. Dit betekent namelijk voor de fotograaf veel dataverkeer waar hij nisk aan heeft. Je wilt dus elke request voor die betreffende foto’s komend van een ander domein dan het eigen domein tegen gaan. Dit kan met deze .htaccess code:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?site.nl/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/hotlink.jpg [L]

Via deze code wordt elke request van een ander domein als site.nl veranderd in een request voor het plaatje /images/hotlink.jpg.

Meer weten?

Hieronder een beperkt en redelijk willekeurig overzicht van interessante artikelen over .htaccess. Uiteraard kun je niet om de manual op Apache.org heen.