I denna lilla guide tänkte jag ta upp gundläggande kunskaper inom regex med hjälp av en hel del exempel. Dessa exempel brukar användas flitigt och är ofta bara att kopiera till ditt eget behov.
Inledning
Regex, reguljära uttryck, är ett sätt att uttrycka ett mönster. Man använder den oftast genom att testa om en textsträng passar i ett visst mönster.
.htaccess är en instruktionsfil till Apache. Apache är den vanligaste webbservern på en linuxdator. Om man använder windows så finns det något liknande men denna guide tar bara upp det vanliga (och användbara).
301-redirect är en HTTP-svarskod som säger till webbläsaren och google "Den här sidan har permanent flyttat till en annan plats. " En redirect behövs då man tar bort gamla urler, till exempel vid en större uppgradering av en webbplats.
Regex - Grunder
Regex ser jättesvåra ut men de är ganska lätta och skriva om man har förstått grunderna. Här nedan är de olika byggstenarna:
(Punkt) . : vad som helst
(Astrix) * : noll, en eller flera
(Plus) + : en eller flera
(Frågetecken) ? : noll eller en
(Pipe) | : alternering
(Parentes) (text) : gruppering
(Hakparentes) [text] : alternering
(Tak) ^ : negering
(Tak) ^ : start på sträng
(Dollartecken) $ : slut på sträng
(Dollartecken) $1 : den första grupperingen/variablen
(Backslash) \ : används för att skydda tecken, tillexempel för att visa att en punk ska vara punkt och inte vad som helst
Det som kan vara lite svårt att förstå utan tydliga exempel är hakparenteserna och variabler.
Kod:
Regexet a[cb]a matchar aba och aca men inte acba eller abca
Kod:
Om regexet start(.*)slut körs mot strängen "startTobiasslut" så kommer variablen $1 att innehålla "Tobias"
Källa: Googlehemsida (här finns också lite exempel)
.htaccess
Nu när vi har ett litet hum om regex så kan vi börja med användbara exempel. Dessa exempel kan du skriva in i din .htaccess fil. .htaccess filen ligger vanligtvis i din webbsidas rootkatalog. (Den kan också ligga i en mapp, men då kontrollerar den bara den mappen och dess undermappar). Innan man skriver dessa exempel måste dessa rader stå i .htaccess:
Kod:
RewriteEngine On #starta motorn
RewriteBase / #vart ska man utgå ifrån, om din webbsida ligger i en undermapp så kanske detta ska ändras...
Exempel 1 - Redirect från non-www till www
Kod:
#Redirect from non-www to www
RewriteCond %{HTTP_HOST} ^exempel\.se [NC]
RewriteRule (.*) http://www.exempel.se/$1 [R=301,L]
Rad1: Om domänen börjar med "exempel.se" (no-case)
Rad2: Så spara allt som står efter domänen i en variabel $1 och Redirecta (301) till http://www.exempel.se/$1 (sluta behandla fler regler)
Exempel 2 - Redirect från www till non-www
Kod:
#Redirect from www to non-www
RewriteCond %{HTTP_HOST} ^www\.exempel\.se [NC]
RewriteRule (.*) http://exempel.se/$1 [R=301,L]
Rad1: Om domänen börjar med "www.exempel.se" (no-case)
Rad2: Så spara allt som står efter domänen i en variabel $1 och Redirecta (301) till http://exempel.se/$1 (sluta behandla fler regler)
Exempel 3 - Redirect från "vilken subdomän som helst" till www
Kod:
RewriteCond %{HTTP_HOST} !^www\.exempel\.se [NC]
RewriteRule (.*) http://www.exempel.se/$1 [R=301,L]
Rad1: Om domänen inte börjar med "www.exempel.se" (no-case)
Rad2: Så spara allt som står efter domänen i en variabel $1 och Redirecta (301) till http://exempel.se/$1 (sluta behandla fler regler)
Exempel 4 - Byt namn på en fil
Kod:
# Rewrite robots.txt to robots.php:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule robots\.txt robots.php [L]
Rad1: Om urlen inte går till en riktig fil
Rad2: Om urlen inte går till en riktig mapp
Rad3: Så om det efter domänen är robots.txt så läs in filen robots.php (sluta behandla fler regler)
Detta är inte en redirect. Detta är en instruktion till webbserven att den ska läsa in robots.php när besökaren vill ha robots.txt.
Exempel 5 - Byt namn på en fil, allmänt
Kod:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)\.htm$ $1.php [L]
Rad1: Om urlen inte går till en riktig fil
Rad2: Om urlen inte går till en riktig mapp
Rad3: Så om det efter domänen är något.htm så läs in filen något.php (sluta behandla fler regler)
Exempel 6 - Ta bort filändelser
Kod:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)\.php /$1 [R=301,L]
Rad1: Om urlen inte går till en riktig fil
Rad2: Om urlen inte går till en riktig mapp
Rad3: Så om det efter domänen är något.php så redirect till /något (sluta behandla fler regler)
Edit: Sen måste man med PHP-script se till att rätt sida visas.
Exempel 7 - Egna felsidor
Kod:
# Customized server error messages:
ErrorDocument 404 /error404.php
ErrorDocument 403 /error403.php
Rad1: Om sidan inte kan hittas, ladda filen error404.php
Rad2 Om sidan är förbjuden, ladda filen error403.php
Exempel 8 - Enkel redirect
Kod:
Redirect 301 /gamal-url.html /en/ny-url
Rad1: Gör en 301 redirect från gamal-url.html till /en/ny-url
Detta kallar jag för en enkel redirect för att här kan man inte använda regex.
Exempel 9 - Redirect en gammal mapp till en ny, allmänt
Kod:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule gammal/mapp/(.*)$ /nytt/$1 [R=301,L]
Rad1: Om urlen inte går till en riktig fil
Rad2: Om urlen inte går till en riktig mapp
Rad3: Så om det efter domänen börjar med sökvägen gammal/mapp/(sen vad som helst) så redirecta (301) till /nytt/(samma vad som helst) (sluta behandla fler regler)
OBS. Detta gäller inte om man går in på www.exampel.se/gammal/mapp. (Studera regexet). Om man vill att även detta sista specialfall ska fångas upp av regeln. Byt ut rad 3 mot denna rad:
Kod:
RewriteRule gammal/mapp/?(/.*)?$ /nytt/$1 [R=301,L]
Exempel 10 - Redirect en gammal domän till en ny
Kod:
RewriteRule (.*) http://www.nydoman.se/$1 [R=301,L]
Rad1: Spara allt som står efter den gamla domänen i en variabel $1 och Redirecta (301) till http://www.nydoman.se/$1 (sluta behandla fler regler)
Detta bör göras om en webbplats byter domän. Denna rad placeras i .htaccess-filen på den gamla domänen.
OBS. Denna rad är den samma som i exempel 1-3. Skillnaden är att det inte finns något villkor framför regeln.
Exempel 11 - Redirect med query string
Kod:
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} ^id=([0-9]*)&category=bananer$
RewriteRule ^(.*)$ http://www.anotherdomain.site/page/newpage [R=301,L]
Om man ska göra en redirect från en sida med query strings så bör man använda rewrite cond och %{QUERY_STRING}. Varken RewriteRule, Redirect eller RewriteMatch läser query strings.
Exempel 12 - Redirect till HTTPS (SSL)
Kod:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Rad1: Om det är port 80, DVS http
Rad2: Redirecta till https://www.example.com
Denna regel kan läggas till efter dina befintliga regler för att kräva att HTTPS-protokollet används.
Fotnot
Alla exempel är inte testkörda i skrivande stund. Kommentera eller PMa om du märker att det är något problem med något exempel så ska jag redigera detta inlägg.
Fler exempel kommer att läggas till vart efter jag ser att det behövs.