Guide till URL-manipulering med mod_rewrite

Mod_rewrite har kallats för voodoo och det med all rätt med tanke på vad man kan göra.

Mod_rewrite är en modul till Apache som möjliggör manipulering av din webbplats URLer för stor nytta i din SEO och för dina användare. Se faktabladet om filnamn för mer information om optimala filnamn, dess nytta och exempel.

Speciellt värdefullt för dig som använder GET-variabler för att visa innehåll.

Tips!

Domainstats logga Jim Westergren har utvecklat Domainstats, en grym tjänst inom SEO där du kan se inlänkar med mera.

Varning

URL-manipulering med mod_rewrite är avancerad SEO som inte alltid är lätt. Det är väldigt lätt att göra fel vilket kan innebära ödesdigra konsekvenser om det inte upptäcks och rättas till. Testa först så att allting funkar. En bokstav fel kan innebära att din webbplats slutar att fungera eller att alla dina resultat i Google förloras.

Har du väl genomfört URL-manipulering kan du sedan efter ett tag inte ändra det, så det gäller att göra rätt från början.

Vad du behöver

Servern som din webbplats finns på måste vara en Apache-server. Kan du köra PHP-programmering på din webbplats så är det vanligtvis en Apache-server.

Sedan behöver du en fil som heter .htaccess, se artikleln om .htaccess, men det går även att använda sig av filen httpd.conf på servern.

Starta motorn

För att starta motorn rekommenderar jag följande 4 rader innan själva kommandoraderna.


Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Förklaring

Själva syntaxen

En enstaka regel

RewriteRule MÖNSTER DESTINATION [FLAGGOR]
Villkor med regel och tillhörande variabel

RewriteCond VILLKOR
RewriteRule MÖNSTER(VARIABLER) DESTINATION [FLAGGOR]

Flaggor

Flaggorna skrives som en kommaseparerad lista inom klamrar ([]) i slutet på raden RewriteRule.

Lista på de vanligaste flaggorna

Variabler

Variabler definieras med () i till exempel MÖNSTER och kan sedan fångas upp under DESTINATION med hjälp av $1, $2 och $3 beroende på hur många du har och i den ordningen.

Variabler som definierats i VILLKOR (RewriteCond) kan sedan fångas upp under DESTINATION med hjälp av %1, %2 och %3 beroende på hur många du har och i den ordningen.

Reguljära uttryck - Regular Expressions (regex)

Med reguljära uttryck kan man specifikt matcha det man vill.

Lista på de vanligaste kommandotecknen

Exempel på reguljära uttryck

Exempel 1: [a-z]+

Matchar: bokstäverna a-z om och om igen tills det att en bokstav som inte är a-z stöts på.
Exempel på matchningar: a, hej, banan

Exempel 2: ([a-z]+)([0-9])

Matchar: bokstäverna a-z precis som ovan och sedan en enstaka siffra efter det. Bokstäverna sparas som en första variabel med () och siffran som en andra variabel.
Exempel på matchningar: artikel1, id2, a4

Exempel 3: ^?page=([a-z]+) [NC]

Matchar: det som startar på ?page= och innehåller a-z som sedan sparas som en variabel med (). [NC] betecknar att stora och små bokstäver inte spelar roll.
Exempel på matchningar: ?page=home, ?page=Start, ?page=A

Exempel 4: ^artikel/([0-9]+)-(.*).php$

Matchar: det som startar på artikel/, innehåller en eller flera siffror som sparas i första variabeln. Sedan ett efterföljande bindestreck och efter det alla tecken som sparas i nästa variabel och slutar på .php
Exempel på matchningar: artikel/34834-en-artikel.php, artikel/398-åberg39.php, artikel/1-.php

Exempel på URL-manipulering med mod_rewrite

Flera av dessa exempel är inte användbara men studera dem noga för att lära dig hur det hela fungerar.

URLer fungerar som /artikel/variabel1/text/variabel2.html medan den faktiska URLen är /?page=variabel1&id=variabel2

RewriteRule ^artikel/(variabel1)/text/(variabel2).html$ /?page=$1&id=$2 [NC,L]
URLer fungerar som /artikel34.html medan den faktiska URLen är /?page=article&id=34

RewriteRule ^artikel([0-9]+).html$ /?page=article&id=$1 [NC,L]
URLer fungerar som utan filändelsen .php medan den faktiska URLen är med .php

RewriteRule ^/?([a-z]+)$ $1.php [NC,L]

Vanliga servervariabler

Används ofta med RewriteCond.

Nästa steg: intern navigering och 301 redirect

När du gjort och testat din URL-manipulering med mod_rewrite så att den är helt rätt är det dags att se till att alla dina interna länkar på din webbplats pekar mot de rätta nya URLerna, annars finns det ingen vits.

När du ändrat din interna navigering är nästa steg är att se till att gamla URLer omdirigeras med 301 redirect till de nya. Se faktabladet: Vidarebefordra med 301 redirect. Detta är mycket viktigt annars kommer du ha två versioner av dina URLer som fungerar vilket skapar dubbelt innehåll. Se faktabladet: Duplicate content.

Exempel på 301 redirect med mod_rewrite

Lika kraftfull som mod_rewrite är på att skriva om URLer är den med att omdirigera URLer.

URLer skickas från /?page=article&id=34 vidare till /artikel34.html med 301 redirect.

RewriteCond %{QUERY_STRING} ^page=article&id=([0-9]+)
RewriteRule ^(.*)$ http://%{HTTP_HOST}/artikel%1.html? [R=301,L]

Se fler exempel på faktabladet om 301 redirect.

Steg-för-steg-exempel från början med PHP och MySQL

Vi tar ett exempel om en sida som drivs med PHP och en MySQL-databas. Låt oss säga att databasen innehåller en tabell för artiklar och denna har kolumner som heter id, headline och content. GET-variabler används för att visa innehåll. Webbplatsens startsida har en dynamisk lista på länkar till artiklarna.

En av artiklarna har rubriken Tio tips för en bra SEO och URLen till denna är /index.php?page=article&id=23.

Den som jobbar med SEO bestämmer sig nu för att fixa detta och har läst sidorna om 301 redirect, optimala filnamn, .htaccess, duplicate content och såklart denna artikel om Guide till URL-manipulering med mod_rewrite.

Som första steg skrivs en funktion med PHP för att konvertera rubriken till en URL som kan se ut så här (vi antar att rubriken är satt som en variabel $headline):


<?php
function URL($headline){
$find = array("å", "ä", "ö", " ");
$replace = array("a", "a", "o", "_");
$replace1 = str_replace($find, $replace, strtolower($headline));
$replace2 = preg_replace('/W/', '', $replace1);
return str_replace('_', '-', $replace2);
}
?>

En enkel <?php echo URL($headline);?> ger oss då värdet tio-tips-for-en-bra-seo vilket är helt perfekt.

Nu dags för mod_rewrite!


Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteRule ^(.+)-([0-9]+) /index.php?page=article&url=$1&id=$2 [L]

Detta får URLen att fungera som /tio-tips-for-en-bra-seo-23.

Med till exempel <?php echo "/".URL($headline)."-".$id."" ?> får vi då /tio-tips-for-en-bra-seo-23 istället för /index.php?page=article&id=23. Se till att ändra alla interna länkar så att det speglar de nya fina filnamnen.

I din sida där du visar artikeln kan du bara fortsätta att plocka fram artikeln från databasen med $_GET["id"];.

Nu återstår bara en 301 redirect från gamla till nya och eftersom vi inte kan plocka variabeln URL($headline genom .htaccess så gör vi hellre denna omdirigering med PHP istället. Alternativet om bara ett fåtal artiklar finns kan vara att lägga in 301 redirect för var och en, se faktabladet om 301 redirect för metoder om detta.

Lösningen med PHP skulle till exempel kunna se ut så här:


<?php
if ($_GET[url] == "" && $_GET[page] == "article" ){
header( "HTTP/1.1 301 Moved Permanently" );
header( "Status: 301 Moved Permanently" );
header( "Location: http://www.domänen.se/".URL($headline)."-".$id."" );
exit(0);
}
?>

För att helt skippa ett ID-nummer i filnamnen så är förmodligen det bästa tipset att du lagrar värdet av URL($headline) direkt som en kolumn i databasen när din artikel matas in i databasen. Kolumnen kanske heter url och du kan sedan använda $_GET["url"]; istället i din SQL SELECT när du plockar innehållet i din artikel från databasen.


Mer läsning / källor

Fråga / diskutera på SEO-forum.se

I sektionen URL-omskrivning.

10 Jun 2009

Denna artikel är skriven av
Senast redigerad: 3 Oct 2013
Feedback uppskattas.