URL-rewrite in het kort

Een URL ‘rewriten’ ofwel herschrijven doe je met een rewrite engine. Deze is een onderdeel van webserversoftware, waarmee je URL’s (Uniform Resource Locators) kunt omleiden. De bekendste rewrite engine is mod_rewrite van de Apache HTTP-server. Alternatieve webservers, zoals nginx of lighttpd, bieden vergelijkbare functies.

Een voorbeeld van een situatie waarin het handig is om een rewrite engine te gebruiken, is wanneer een complexe, dynamische URL (die bijvoorbeeld door een contentmanagementsysteem is aangemaakt) in een gebruiksvriendelijke URL moet worden omgezet. Dit wordt vaak gedaan omdat een technische URL als

http://voorbeeld.com/a/index.php?title=paginatitel

moeilijk te begrijpen is voor menselijke gebruikers. Met een rewrite engine kun je dezelfde webpagina toegankelijk maken via een duidelijkere URL, zoals:

http://voorbeeld.com/artikel/paginatitel

Een internetgebruiker kan de nieuw aangemaakte URL dus invoeren om naar de betreffende webpagina te gaan. Als een dergelijk verzoek bij de webserver binnenkomt, wordt de URL door de rewrite engine automatisch weer omgeschreven naar het schema dat binnen de server wordt gehanteerd: http://voorbeeld.com/a/index.php?title=paginatitel.

Op deze manier creëert de rewrite engine een soort abstractielaag tussen de URL's die de website intern gebruikt en de URL’s die zichtbaar zijn op het web. Dit maakt het mogelijk om − onafhankelijk van interne technische eisen − een gebruiksvriendelijke, uniforme adressering te bieden.

Intern kan het dynamische, geparametriseerde adres gebruikt blijven worden, terwijl bezoekers van je site een ogenschijnlijk statisch adres zien. Dit heeft als voordeel dat de extern gepresenteerde URL's geldig blijven; ook als je de interne bestandsstructuur van de website verandert.

Bovendien kun je als webbeheerder de rewrite engine gebruiken voor adresomleidingen, waarbij je specifieke voorwaarden kunt instellen. Zo is het mogelijk om een omleiding in te stellen op basis van de user agent ID of het IP-adres van de client. Zo kun je geotargeting implementeren of de website optimaliseren voor het apparaat van de bezoeker. Meestal wordt een 301-redirect gebruikt, die ervoor zorgt dat de zoekmachine − ondanks de parallel werkende mobiele websites of verschillende taalversies − altijd maar één websiteversie in de index opslaat.


Voorbeeldtoepassingen van URL-rewriting

De rewrite engine biedt diverse opdrachten voor het manipuleren van URL’s, die je op verschillende plaatsen in de webserversoftware als regels kunt invoeren. Zo kun je mod_rewrite, de rewrite engine van de Apache-webserver, gebruiken in een directory-container binnen httpd.conf, in een VirtualHost-sectie of in het .htaccess-bestand. In nginx noteer je URL-rewriting in het configuratiebestand /etc/nginx/nginx/nginx.conf. In lighttpd gebruik je het bestand /etc/lighttpd.conf in de vHost-configuratie.

Wil je bijvoorbeeld de dynamische URL http://example.com/a/index.php?title=paginatitel via een rewrite engine omschrijven naar de statische URL http://example.com/artikel/paginatitel, dan gebruiken de webservers Apache, nginx en lighttpd hiervoor verschillende opdrachten. Deze zetten we hieronder op een rij.


rewrite engine Apache

URL-rewrite in Apache: mod_rewrite

Om mod_rewrite in Apache te gebruiken, moet de rewrite engine geactiveerd worden met de aanwijzing RewriteEngine on. Hierop volgt de RewriteRule, die met behulp van zogenaamde reguliere expressies (‘regular expressions’, regex) de instructies voor het herschrijven van URL's definieert:

RewriteEngine on
RewriteRule ^/artikel/(.*)$ /a/index.php?title=$1

Als de RewriteRule een omleiding definieert, bevat deze twee parameters: het zoekpatroon en het doelpatroon.

  • Zoekpatroon - Deze parameter beschrijft de URL's die moeten worden omgeleid. Een bepaalde voorwaarde wordt gedefinieerd in de vorm van een tekenreeks. Als aan deze voorwaarde is voldaan, vindt omleiding naar een URL plaats volgens het doelpatroon. In het voorbeeld staat het zoekpatroon in dit deel van de RewriteRule: ^/artikel/(.*
  • Doelpatroon - Deze parameter beschrijft de URL waarnaar wordt omgeleid. Als de omleiding op server-niveau is geconfigureerd, wordt de volledige URL vervangen. Op directory-niveau in het .htaccess-bestand of in httpd.conf wordt alleen het pad vanaf de huidige directory vervangen. In het voorbeeld staat het doelpatroon in dit deel van de RewriteRule: /a/index.php?title=$1.

In onderstaande tabel zie je een toelichting van de reguliere expressies in ons voorbeeld:

Reguliere expressie Toelichting
^ Geeft het begin van een string aan.
$ Geeft het einde van een string aan.
(.*) Een placeholder voor elke string binnen een URL. De haakjes slaan de string op in een variabele.
$1 Een variabele waarmee kan worden teruggegrepen op de waarden die tussen de haakjes zijn opgeslagen.

De RewriteRule ^/artikel/(.*)$ /a/index.php?title=$1 legt dus de regel vast, dat bij alle URL’s die beginnen met de string /artikel/(.*), dit deel wordt omgeschreven naar het dynamische URL-schema /a/index.php?title=$1, waarbij $1 staat voor de string die bij de placeholder (.*) hoort.

Als een internetgebruiker de statische URL http://voorbeeld.com/artikel/paginatitel in de webbrowser invoert, schrijft de webserver dit om naar de dynamische URL http://voorbeeld.com/a/index.php?title=paginatitel via mod_rewrite. Dit gebeurt intern en is onzichtbaar voor de gebruiker. In dit geval komen de placeholder (.*) en variabele $1 overeen met de tekenreeks paginatitel.

Moet de URL-rewriting gekoppeld worden aan bepaalde opties die het gedrag van mod_rewrite sturen, dan zet je deze na de RewriteRule tussen vierkante haakjes en (als er meerdere opties gelden) scheid je ze met komma’s. Op deze manier kun je ook externe omleiding via HTTP-statuscode realiseren. De onderstaande tabel toont een aantal opties voor de RewriteRule. Op de officiële website van de Apache Software Foundation vind je een volledige lijst.

Optie Flag Functie
Redirect R De flag [R] instrueert de webserver een externe omleiding via HTTP-statuscode 302 uit te voeren. Als een andere statuscode moet worden verzonden, wordt deze met een is-teken aan de flag toegevoegd (bijv.[R=301]).
Forbidden F Geeft de webserver de opdracht om HTTP-statuscode 403 (Forbidden) naar de webbrowser te verzenden.
Gone G Laat de webserver HTTP-statuscode 410 (Gone) naar de webbrowser sturen en markeert de betreffende pagina als niet meer beschikbaar.
Last L Geeft de webserver opdracht om na de huidige RewriteRule geen volgende meer uit te voeren.
Nocase NC Bij het controleren of een URL voldoet aan de eis voor rewriting, wordt niet gelet op hoofdletters en kleine letters.
Chain C De volgende RewriteRule geldt alleen als de huidige voorwaarde is vervuld.

Op basis van een dergelijke optie kan je een externe omleiding via HTTP-statuscode als volgt realiseren:

RewriteEngine On
RewriteRule ^oudepagina.html$ /nieuwepagina.html [R=301]

Naast RewriteRules kun je mod_rewrite gebruiken om zogenaamde RewriteConds te definiëren, waarmee websiteheerders aanvullende voorwaarden voor een URL-rewrite kunnen definiëren.

De RewriteCond staat vóór de RewriteRule en heeft deze syntaxis:

RewriteCond TESTSTRING CONDITION

De teststring bevat over het algemeen zogenaamde servervariabelen, gedefinieerd door een procentteken en accolades, zoals %{HTTP_HOST}. In onderstaande tabel zie je een aantal servervariabelen.

Servervariabele Toelichting
HTTP_USER_AGENT Heeft betrekking op de client die wordt gebruikt voor servertoegang. De variabele wordt meestal gebruikt om verschillende webbrowsers te voorzien van een geoptimaliseerde website.
HTTP_HOST Heeft betrekking op de hostnaam en kan waarden bevatten als domein.com, subdomein.domein.com of het IP-adres.
SERVER_PORT Heeft betrekking op de geadresseerde poort (bijv. 80 voor HTTP of 443 voor HTTPS). De variabele stelt websitebeheerders in staat bezoekers om te leiden naar een beveiligde verbinding.
REMOTE_ADDR Heeft betrekking op het IP-adres van de gebruiker die verbinding maakt met de webserver. Deze variabele wordt soms gebruikt om spam te blokkeren.

Het volgende voorbeeld laat een RewriteCond zien, die een RewriteRule bindt aan het IP-adres van een gebruiker van de webserver:

RewriteCond %{REMOTE_ADDR} 173.45.68.79

rewrite engine nginx

URL-rewriting in nginx

Ook de nginx-webserver ondersteunt standaard URL-rewriting. Dit gebeurt eveneens met behulp van reguliere expressies. Om URL's te herschrijven, voeg je de rewrite-opdracht gewoon in een {[...] }-blok in; volgens de nginx-syntaxis. Dat doe je in het webserver-configuratiebestand /etc/nginx/nginx.conf:

location /artikel {
	rewrite ^/artikel/(.*)$ /index.php?title=$1 last;
}

Met location /artikel geven websitebeheerders aan dat de URL-rewrite betrekking heeft op de subdirectory artikel. De reguliere rewrite-expressies zijn dezelfde als op de Apache-webserver en worden ingeleid met de opdracht rewrite. De flag last geeft aan dat het herschrijven intern moet gebeuren, en dus zonder omleiding. Als alternatief zijn er flags voor een tijdelijke of permanente omleiding:

Flag Uitleg
last URL's worden intern herschreven. Er is geen omleiding.
redirect De gebruiker wordt tijdelijk doorgestuurd naar de nieuwe URL via een 302-redirect.
permanent De gebruiker wordt permanent doorgestuurd naar de nieuwe URL via een 301-redirect.

Als je geen flag gebruikt, grijpt nginx automatisch terug op de HTTP-foutcode 500.


rewrite engine lighttpd

Rewrite in lighttpd

In lighttpd realiseer je een URL-rewrite met de functie url.rewrite-TYP. De placeholder TYP staat voor verschillende rewrite-configuratieopties:

Rewrite-configuratiemogelijkheid Toelichting
url.rewrite-once Eenmalige URL-rewrite. Als het zoekpatroon is gevonden en de URL is herschreven volgens het doelpatroon, volgen geen andere rewrites meer.
url.rewrite-repeat In tegenstelling tot url.rewrite-once, kunnen bij url.rewrite-repeat meerdere rewrites na elkaar plaatsvinden.

Aangezien lighttpd voor URL-rewrites dezelfde reguliere expressies gebruikt als Apache, is de syntaxis in principe op dezelfde manier opgebouwd:

url.rewrite-once = (
	"^/artikel/(.*)$" => "/index.php?title=$1"
)

Als er een externe omleiding moet plaatsvinden − in plaats van een interne rewrite − gebruikt lighttpd niet de rewrite-module, maar een redirect-module. De URL’s gaan hierbij eerst door de rewrite-module en dan door de redirect-module.


rewrite engine Microsoft IIS

De URL-rewrite in Microsoft IIS

Microsoft IIS (Internet Information Services) is een platform zonder native rewrite engine. Je kunt deze echter alsnog aan de webserver toevoegen met de module IIS URL Rewrite 2.0. Microsoft-gebruikers kunnen hun websitebezoekers dus ook voorzien van duidelijke URL's, zonder hiervoor de interne bestandsstructuur te hoeven veranderen. De URL-rewriting-extensie wordt direct na het downloaden geïntegreerd in de IIS Manager-interface. Daar kun je de RewritingRules via een grafische gebruikersinterface invoeren. IIS URL Rewrite 2.0 gebruikt eveneens reguliere expressies om URL-zoek- en doelpatronen te definiëren.


URL-rewriting en SEO (zoekmachineoptimalisatie)

Met een rewrite engine schrijf je geparametriseerde URL’s dus om naar begrijpelijke, gebruiksvriendelijke URL’s. Daarom worden de functies van mod_rewrite en de vergelijkbare implementaties in andere webserversystemen ook vaak in verband gebracht met SEO (zoekmachineoptimalisatie). Hierbij staat ter discussie of gebruiksvriendelijke URL’s daadwerkelijk voor een betere ranking zorgen. Duidelijk bewijs hiervoor ontbreekt namelijk. Desalniettemin verwachten we dat websitebeheerders profiteren van indirecte effecten. Omdat internetgebruikers in de zoekresultaten geen onbegrijpelijke parameters, maar de herschreven URL's zien, hebben ze een beter beeld van de pagina’s waar de links naartoe leiden. Rewriting kan dus meer vertrouwen creëren en er ook toe leiden dat meer gebruikers je site aanklikken.