När man inser att webbläsarna faktiskt talar om vilka olika format de kan hantera kommer nästa fråga som ett brev på posten: Hur kan man dra nytta av det då?
Jo, om man t.ex. kör sin webbplats på en Apache-server så finns det flera inbyggda möjligheter man kan utnyttja…
Denna artikel beskriver en av dem….
mod_rewrite ? vaddå rewrite ?
mod_rewrite är en modul i Apache som ger dig möjlighet att koppla ihop de webbadresser (URL:ar) som surfarna anger med fysiska filer i webbserverns filsystem.
Hmm, vaddå koppla ihop? - kanske du tänker då.
Normalt sett är detta inte så mycket man behöver tänka på, eftersom en fil i en katalog under “webbroten” brukar finnas tillgänglig även på nätet - men man kan göra så mycket mer om man har rättigheter att använda mod_rewrite. Framförallt kan man dels stuva om var filerna ligger - men man kan också lägga vissa villkor på vad som skall “vidarekopplas” vart…
Och det är där en intressant möjlighet yppar sig för oss som vill tillhandahålla olika format beroende på vad webbläsarna begär…
Men först - en brasklapp!
När man mekar med mod_rewrite är det oerhört lätt att man av misstag “skjuter sig i foten” och råkar skapa en eller annan regel som hänger webbservern (genom att t.ex. skapa regler som av misstag anropar sig själva och på så sätt skapar oändliga loopar). Därför vill jag uppmana dig som tänker ge dig på detta att alltid först testa dina regler på en lokal webbserver innan du lägger upp dem på ett “skarpt” webbhotell eller en “skarp” webbserver
mod_rewrite - grunderna
När man har aktiverat mod_rewrite, så har man i praktiken slagit på möjligheter i Apache att lägga upp virtuella sökvägar till filer som kan ligga nästan varsomhelst.
Det man gör är att lägga “vidarekopplingsdirektiv” i filen .htaccess (som ju i Apache-världen innehåller lokala inställningar för en viss webbmapp - t.ex. den mapp som är roten på en webbplats).
Principen:
I .htaccess i rotkatalogen lägger man in direktiv typ:
RewriteEngine On
RewriteRule ^syndikering/$ /index.xml [R=301]
Regeln kommer från min gamla beprövade .htaccess - där jag valt att “pensionera” den gamla katalogen /syndikering/ genom att ta bort den från filstrukturen, samtidigt som jag ändå låter den leva kvar i “tankevärlden” genom att regeln ovan gör att alla som försöker komma åt http://xhtml.se/syndikering/ i verkligheten automatiskt kommer att “kopplas om” till http://xhtml.se/index.xml
Format:
RewriteRule mönster ersättningsmönster [inställningar]
Några saker som kan tänkas se konstiga ut
^ betyder “från första tecknet”
$ betyder “där det inte finns fler tecken efter”
[R=301] betyder “gör en redirect med HTTP-svarskoden 301” - dvs “vidarekoppling” med svarskod som indikerar att sidan flyttat permanent
Alltså: Översätt allt som matchar mönstret syndikering/ där det inte finns något varken framför eller bakom och “vidarekoppla” användaren till /index.xml
Man kan också “stapla” regler efter varandra, vilket demonstreras av följande:
RewriteRule ^syndikering/$ /index.xml [L,R=301]
RewriteRule ^syndikering/index.xml$ /index.xml [L,R=301]
RewriteRule ^syndikering/index.rdf$ /index.rdf [L,R=301]
RewriteRule ^syndikering/index.rss$ /index.rss [L,R=301]
Kommentar, i inställningen [L,R=301] betyder L “Tolka inte fler regler om detta matchar” och “R=301” Redirect med returkod 301 (som ovan).
Kommatecknet anger att det är två “inställningar” (_options_)
Jaha - men det där med olika kod till olika webbläsare då?
Jodå - det går också att göra!
För varje regel man lägger upp kan man också ange ett eller flera villkor (RewriteCond)
Exempel:
RewriteCond %{HTTP_USER_AGENT} ^Lynx/.*
RewriteRule ^$ /index.htm [L]
Vilket betyder att för alla som använder Lynx - min variant anger HTTP-fältet “Browser agent” till
Lynx/2.8.3rel.1 libwww-FM/2.14FM
(som ju börjar med texten “Lynx/”) - så skall en “tom sökväg” (dvs http://example.se/ ) betyda att man serverar filen index.htm (som då alltså kan vara en avskalad variant av ens webbplats)
Men det där med HTTP_ACCEPT då?
Jo - det kan man också använda! - man kan använda strängen i HTTP_ACCEPT i olika villkor om man vill…
Här är en regel som jag använde ganska länge här på webbplatsen när jag drev den med hjälp av Blosxom:
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0
RewriteRule ^$ /index.xhtml [L]
När man anger flera RewriteCond efter varandra på det här sättet, så utförs regeln bara om samtliga villkor är uppfyllda.
I detta fall - Om HTTP_ACCEPT innehållet “application/xhtml+xml samtidigt som det garanterat inte är så att det finns en q-faktor som har värdet noll, så skall den som bara “tittar in” till webbplatsen vidarekopplas till filen index.xhtml (som kanske är en fil skriven i xhtml 1.1 som serveras med application/xhtml+xml).
Hmm - OK, men hur gör jag allt detta praktiskt nu då?
Ja - här är ett sätt:
- Se till att alla olika format ligger i helt separata filträd på så sätt att t.ex. alla filer med extensionen .html bara innehåller länkar till andra filer med extensionen .html.
- Gör samma sak för filer med extensionenrna “.xhtml” och “.htm” (om du har en avskald version av webbplatsen).
- och kanske “.xml” om du har ett newsfeed.
Tricket du lutar dig på blir med det upplägget alltså att guida in besökare som kommer till webbplatsen via startadressen till en version som du vet att de garanterat kan hantera (via regler för mod_rewrite). Det är det som reglerna ovan gör - dvs:
- Har du en Lynx (eller t.ex. en AvantGo-läsare i din Palm) - så får du den “avskalade versionen”. - här utför servern alltså en “browser-sniffing” som i första exemplet ovan baserat på reglerna du ställt in.
- Har du en MSIE, får du den “bakåtkompatibla”, tabellbaserade, versionen med extensionen .html (eftersom MSIE inte anger att den “kan” application/xhtml+xml - här körs alltså en koll mot vad som anges i HTTP_ACCESS)
- och har du en Mozilla eller en annan webbläsare som anger att den kan läsa application/xhtml+xml-kodade webbsidor, så får de besökarna din xhtml-formaterade version som kanske är extra tungt beroende av CSS
Sammanfattning
mod_rewrite i Apache-servern är ett kraftfullt verktyg som man kan använda till oerhört mycket olika saker.
Framförallt kan man använda den till mycket mer än vad jag beskrivit här…
Ett citat från en artikel på apache.org som jag verkligen tycker stämmer spöklikt bra in på mina egna erfarenheter är:
“With mod_rewrite you either shoot yourself in the foot the first time and never use it again or love it for the rest of your life because of its power.”
Kanske är användandet av mod_rewrite att ta till en lite för stor slägga för att lösa en tillsynes enkel uppgift.
Kanske är det det enklaste sättet…
För mig funkade det bra iallafall under den tid jag körde med statisk generering av allt material - och med några andra regler funkar det lika bra idag när jag har valt att skapa alla sidor dynamiskt utifrån en databas trots att de utifrån sett ser ut att vara statiska sidor… ;)
