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.
Jim Westergren har utvecklat Domainstats, en grym tjänst inom SEO där du kan se inlänkar med mera.
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.
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.
För att starta motorn rekommenderar jag följande 4 rader innan själva kommandoraderna.
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
Options +FollowSymLinks
- en säkerhetsinställning som måste vara på. Är ofta redan på i httpd.conf men skadar inte att den sätts på en gång till.Options +Indexes
- om du använder mappar så måste denna sättas på.RewriteEngine On
- Startar motorn.RewriteBase /
- denna rad sätter vart basen av dina URLer ska ligga, rekommenderas att sättas som rooten.
RewriteRule MÖNSTER DESTINATION [FLAGGOR]
RewriteCond VILLKOR
RewriteRule MÖNSTER(VARIABLER) DESTINATION [FLAGGOR]
Flaggorna skrives som en kommaseparerad lista inom klamrar ([]) i slutet på raden RewriteRule
.
R=301
= omdirigera med 301 redirectNC
= nocase, ej känslig gentemot stora och små bokstäverL
= Avsluta processenF
= Forbid, blockera åtkomst med HTTP-status 403OR
= Eller nästa. Används när det finns flera VILLKOR.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.
Med reguljära uttryck kan man specifikt matcha det man vill.
.
= matchar alla individuella tecken. a.
matchar till exempel allt som börjar med bokstaven a och innehåller två tecken.[]
= klamrar används för att matcha omfång. [a-z]
matchar till exempel alla små bokstäver mellan a till z,[0-9]
alla siffror och [abc]
endast bokstäverna abc.[^]
= Samma som ovan fast med en negativ betydelse. [^0-9]
matchar till exempel allt som inte innehåller siffror.^
= en sträng måste börja vid denna punkt.$
= en sträng måste sluta vid denna punkt.*
= inga eller flera utav de föregående uttrycken.+
= en eller flera utav de föregående uttrycken.?
= inga eller en av de föregående uttrycken. Används även som sista tecken i en DESTINATION för att skala bort variabler från URLen. |
= betyder eller. han|hon
skulle till exempel matcha antingen han eller hon.()
= Parenteser används för att spara variabler för senare användning och används även för att gruppera text, ofta tillsammans med *
, +
och ?
. h(a|o)n
matchar antingen han eller hon.
= Eftersom tecknen .+*^$[](){}!
har en speciell betydelse används
för att "escapa" dessa tecken när du vill att de ska tydas bokstavligen. Till exempel .php$
för att matcha allt som slutar på .php.#
= Detta tecken används i början av en rad för att göra raden till en kommentar.[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
([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
^?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
^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
Flera av dessa exempel är inte användbara men studera dem noga för att lära dig hur det hela fungerar.
RewriteRule ^artikel/(variabel1)/text/(variabel2).html$ /?page=$1&id=$2 [NC,L]
RewriteRule ^artikel([0-9]+).html$ /?page=article&id=$1 [NC,L]
RewriteRule ^/?([a-z]+)$ $1.php [NC,L]
Används ofta med RewriteCond.
%{QUERY_STRING}
= GET-variabler i en URL%{HTTP_USER_AGENT}
= Användaragent%{REQUEST_METHOD}
= POST eller GET%{REQUEST_URI}
= Vilken URL som efterfrågas%{HTTP_REFERER}
= Referrer%{HTTP_HOST}
= Din domän inklusive eventuella subdomänerNä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.
Lika kraftfull som mod_rewrite är på att skriva om URLer är den med att omdirigera URLer.
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.
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.
I sektionen URL-omskrivning.