Bästa lösningen för att omdirigera från icke-www till www och från HTTP till HTTPS med .htaccess

Omdirigera från icke-www till www och HTTP till HTTPS på enklast möjliga sätt med ett minimum av förfrågningar. (Med .htaccess.)
Hantering av www och HTTPS har en betydande inverkan på såväl användarupplevelse som SEO.

Man hittar ett otal olika, mer eller mindre komplicerade förslag på hur man bäst omdirigerar från icke-www till www (och vice versa) och från HTTP till HTTPS med hjälp av .htaccess och mod_rewrite i Googles sökresultat och jag har haft svårt att avgöra vilket som är det bästa.

Som jag resonerar måste den bästa lösningen infria följande villkor:

  1. mod_rewrite-koden är den enklaste möjliga (KISS)
  2. Lösningen orsakar ett minimum av omdirigeringar/HTTP-förfrågningar

Utifrån de två villkoren har jag kommit fram till att den bästa lösningen för att omdirigera från icke-www till www och från HTTP till HTTPS borde vara:

# Omdirigera icke-www till www och HTTP till HTTPS
RewriteCond %{HTTP_HOST} ^svesok.se [NC,OR]
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://www.svesok.se/$1 [R=301,L]

Jag har sett att många lösningar använder två separata omskrivningsregler med omdirigering för att hantera www och HTTPS. I min mening orsakar det helt onödiga omdirigeringar genom att när såväl www som HTTP ska skrivas om genomföra omdirigeringen i två steg, http://svesok.se → http://www.svesok.se → https://www.svesok.se (eller http://svesok.se → https://svesok.se → https://www.svesok.se), när vi kan gå på slutmålet https://www.svesok.se direkt.

Vidare används ofta olika variabler i omskrivningsregeln vilket jag antar är fördelaktigt ur ett portabilitetsperspektiv men enligt min erfarenhet orsakar onödiga fel eftersom variablerna många gånger visar sig vara beroende av en konfiguration som vi som sitter och gör det här i .htaccess inte har koll på. I mitt lösningsexempel ovan skulle man eventuellt kunna använda https://%{SERVER_NAME}/$1 i stället för https://www.svesok.se/$1 som substitution i omskrivningsregeln men jag föredrar det senare för att vara helt säker på vad jag omdirigerar till.

Avslutningsvis så ser jag ofta ^(.*)$ i stället för (.*) som mönster i omskrivningsregeln och jag har aldrig förstått syftet med att inkludera ^ (början på strängen) och $ (slutet på strängen) när vi vill matcha hela strängen villkorslöst.

Leave a Reply