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).
-
RewriteMap lowercase int:tolower
-
RewriteRule ^/([^A-Z]*[A-Z].*)$ http://www.domein.nl/${lowercase:$1} [R=301,L]
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.
-
RewriteMap lowercase int:tolower
Dan plaats je in je .htaccess bestand de RewriteRule.
-
RewriteRule ^([^A-Z]*[A-Z].*)$ http://www.domein.nl/${lowercase:$1} [R=301,L]
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.
-
# 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]
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:301 redirect apache htaccess mod rewrite pagerank rewritemap rewriterule
31 July 2007
Reacties(3)






