Case Insensitive 301 Redirects Met mod_rewrite
Recentelijk moest ik case insensitive 301 redirects aanmaken op een Apache web server. De betreffende website maakte gebruik van keyword rich URLs, maar was niet consequent met hoofdletters en kleine letters. Sommige URLs leken op domein.nl/Plaatsnaam (hoofdletter) en andere op domein.nl/plaatsnaam. Door de inconsequente URLs kreeg de website heel wat pagina’s in de supplemental index, omdat de twee URLs (met en zonder hoofdletter) niet identiek waren maar wel dezelfde content leverden. Met andere woorden, er waren duplicate content problemen. Dit probleem is vergelijkbaar met websites die wel of geen www gebruiken.
Een oplossing is gebruik maken van mod_rewrite. Er moeten namelijk case insensitive 301 redirects komen en mod_rewrite levert deze functionaliteit. Na overleg met de webmaster is besloten om alle URLs lowercase te maken, dus alle URLs bestaan uit alleen kleine letters. Om deze verhuizing zo prettig mogelijk te maken hebben we gebruik gemaakt van case insensitive 301 redirects. Kortom, alle URLs met een hoofdletter erin zullen een 301 redirect krijgen naar de URL met alleen kleine letters.
Het is belangrijk om een 301 redirect te gebruiken omdat wij alle link juice willen behouden. Zonder een 301 redirect zullen wij die allemaal verliezen en hebben alle backlinks naar de URLs met hoofdletters weinig tot geen waarde.
Na wat speurwerk heb ik drie manieren gevonden om case insensitive 301 redirects aan te maken. Let op, we maken hier gebruik van Apache en mod_rewrite!
#1 RewriteMap, RewriteRule, httpd.conf
Zet de volgende code in je httpd.conf (configuratie bestand van Apache).
[code]
RewriteMap lowercase int:tolower
RewriteRule ^/([^A-Z]*[A-Z].*)$ http://www.domein.nl/${lowercase:$1} [R=301,L]
[/code]
Deze code maakt gebruik van de system call tolower. Maak je geen zorgen, je hoeft niet precies te weten hoe het werkt. Gewoon de code overnemen en het werkt :-)
Deze code werkt alleen als je toegang hebt tot je httpd.conf bestand. Voor meeste shared hosting pakketten is deze oplossing niet beschikbaar, maar gelukkig zijn er andere oplossingen (zie #3).
#2 RewriteMap, RewriteRule, .htaccess
In je httpd.conf zet je de RewriteMap functie.
[code]
RewriteMap lowercase int:tolower
[/code]
Dan plaats je in je .htaccess bestand de RewriteRule.
[code]
RewriteRule ^([^A-Z]*[A-Z].*)$ http://www.domein.nl/${lowercase:$1} [R=301,L]
[/code]
Deze is vergelijkbaar met de eerste methode, maar je hebt nog steeds toegang nodig tot je httpd.conf bestand.
#3 .htaccess
Deze oplossing gebruikt alleen .htaccess en is dus voor meeste shared hosting pakketten een goede oplossing. Het enige nadeel is dat deze oplossing wel langzamer is dan oplossing #1 en #2. Waar de eerste twee gebruik maken van een system call (werkt via onderliggende software) maakt deze oplossing gebruik van on-the-fly vertaling van hoofdletters naar kleine letters. Met andere woorden, elke keer dat er een URL wordt bezocht moet de Apache software eerst de URL omzetten in kleine letters, letter voor letter.
[code]
# Als er geen hoofdletter te vinden is,
#sla dan de volgende 28 rewrite rules over.
RewriteRule ![A-Z] - [S=28]
# Vertaal elke hoofdletter in kleine letter
RewriteRule ^([^A]*)A([^<]*) $1a$2<
RewriteRule ^([^B]*)B([^<]*) $1b$2<
RewriteRule ^([^C]*)C([^<]*) $1c$2<
RewriteRule ^([^D]*)D([^<]*) $1d$2<
RewriteRule ^([^E]*)E([^<]*) $1e$2<
RewriteRule ^([^F]*)F([^<]*) $1f$2<
RewriteRule ^([^G]*)G([^<]*) $1g$2<
RewriteRule ^([^H]*)H([^<]*) $1h$2<
RewriteRule ^([^I]*)I([^<]*) $1i$2<
RewriteRule ^([^J]*)J([^<]*) $1j$2<
RewriteRule ^([^K]*)K([^<]*) $1k$2<
RewriteRule ^([^L]*)L([^<]*) $1l$2<
RewriteRule ^([^M]*)M([^<]*) $1m$2<
RewriteRule ^([^N]*)N([^<]*) $1n$2<
RewriteRule ^([^O]*)O([^<]*) $1o$2<
RewriteRule ^([^P]*)P([^<]*) $1p$2<
RewriteRule ^([^Q]*)Q([^<]*) $1q$2<
RewriteRule ^([^R]*)R([^<]*) $1r$2<
RewriteRule ^([^S]*)S([^<]*) $1s$2<
RewriteRule ^([^T]*)T([^<]*) $1t$2<
RewriteRule ^([^U]*)U([^<]*) $1u$2<
RewriteRule ^([^V]*)V([^<]*) $1v$2<
RewriteRule ^([^W]*)W([^<]*) $1w$2<
RewriteRule ^([^X]*)X([^<]*) $1x$2<
RewriteRule ^([^Y]*)Y([^<]*) $1y$2<
RewriteRule ^([^Z]*)Z([^<]*) $1z$2<
# Zet de Redirect variabel op Yes om aan te
# geven dat er minstens 1 hoofdletter is vervangen.
RewriteRule . - [E=Redirect:Yes]
# Als er nog een hoofdletter in de URL is, dan begint
# de loop opnieuw vanaf bovenaan.
RewriteRule [A-Z][^<]*< - [N]
# Er zijn geen hoofdletters meer in de URL.
# Controleer op de Redirect variabel op Yes staat.
# Zoja, 301 redirect naar de URL met alleen kleine letters.
RewriteCond %{ENV:Redirect} ^Yes$
RewriteRule ^([^<]+) http://www.domein.nl/$1 [R=301,L]
[/code]
Scriptlevel HTTP 301 Redirects
Deze oplossingen maken allemaal gebruik van de web server configuraties. Deze manier van redirecten moet je altijd gebruiken wanneer dat kan, omdat het de meeste efficiente oplossing is. Je kunt ook case insensitive 301 redirects aanmaken op script level, zoals PHP en ASP, maar dit is wel heel traag. Desondanks is het zeker mogelijk en soms de enige oplossing, zoals bij het verhuizen van een blog.
[tags]pagerank, 301 redirect, apache, mod_rewrite, rewritemap, rewriterule, htaccess[/tags]
Nog een weekje vakantie
Het is goed dat er lezers af en toe een reactie achterlaten op de website met de vraag wanneer de volgende post komt! Om eerlijk te zijn, afgelopen weken heb ik uitgebreid vakantie kunnen vieren. Bijna 5 weken lang heb ik bijna geen computer aangeraakt behalve om af en toe mijn mail te checken. Maar de vakantie is bijna over :-)
Wanneer kun je weer nieuwe posts verwachten van mij? Vanaf volgende week zal ik weer actief bloggen. Ik heb weer een aantal nieuwe ideeen waarover ik zal schrijven. Een aantal artikelen moet ik nog steeds afmaken, die liggen al enkele maanden als draft klaar, waaronder dash vs underscore en supplemental index tips en truuks. Daarnaast ga ik mij ook steeds meer concentreren op information retrieval-achtige onderwerpen (WARNING: IR bevat veel wiskunde!). Zo zal ik uitleggen hoe zoekmachines werken, maar dan zal ik het vooral hebben over de techniek achter zoekmachines (zonder wiskunde!). Daarnaast zal ik ook een aantal reviews schrijven over SEO en Information Retrieval (een zoekmachine technologie course die op verschillende universiteiten wordt aangeboden, misschien ook in Nederland ergens?) gerelateerde boeken. Ook reviews van betaalde diensten zoals verschillende keyword research diensten e.d. Kortom, genoeg materiaal voor de komende weken!
Natuurlijk zijn gastbloggers altijd welkom om een artikel te schrijven voor dit blog. Wilde je altijd al schrijven voor een SEO blog? Dit is je kans!
Oja, ik ben een gelukkige iPhone bezitter. Bloggen vanaf dat ding is best cool zoals deze post laat zien! :-)