
🛠 Hur du lägger till Expires headers i .htaccess: steg för steg-guide
Du körde ett test i GTmetrix, och där står det i rött: "Add Expires Headers". En bekant syn. Sajten ligger på WordPress, webbhotell på Apache, och hastighetstestet kräver att du konfigurerar webbläsarens cachelagring via .htaccess.
Felet är inte kritiskt, men det är irriterande. Utan Expires-headers laddar webbläsaren om bilder, CSS och skript från servern vid varje besök. Om och om igen. Även om ingenting har ändrats. Hastigheten sjunker, användare väntar, Google sänker rankingen.
Du kan fixa det här på fem minuter. Två metoder: manuellt via kod i.htaccess eller med ett plugin i två klick. Här nedanför finns båda, med färdig kod och inställningar.
💡 Snabb översikt:
- Förstå hur Expires- och Cache-Control-headers hanterar webbläsarens cache
- Lägg till färdig kod i.htaccess: kopiera, klistra in, kontrollera
- Installera pluginet AEH Speed Optimization på en minut om du inte vill röra kod
- Konfigurera optimala cachelagringsperioder för bilder, CSS, JS och typsnitt
Så fungerar Expires-headers
När en besökare landar på en sajt laddar webbläsaren dussintals filer: HTML-sidan, CSS-stilar, JavaScript, typsnitt, ikoner, bilder. Varje fil är en separat HTTP-förfrågan till servern. Ju fler förfrågningar, desto längre laddningstid.
Headern Expires säger till webbläsaren: "den här filen ändras inte, spara den i cache och fråga inte igen förrän ett visst datum." Vid återbesök hämtar webbläsaren filer från lokal cache istället för att hämta från servern igen. Resultat: dussintals färre förfrågningar och snabb laddning.
Den moderna motsvarigheten är headern Cache-Control med direktivet max-age. Den anger cachens livslängd i sekunder, inte ett specifikt datum, och anses nu vara primär. Vi rekommenderar att du konfigurerar båda headers samtidigt: Expires för gamla webbläsare och proxyservrar, Cache-Control för allt modernt. Båda skrivs i samma.htaccess-block.

Metod 1: kod i.htaccess
Den mest direkta vägen är att lägga till cachelagringsregler direkt i Apaches konfigurationsfil. Filen .htaccess ligger i sajtroten (samma plats som wp-config.php). Om du inte ser den, aktivera visning av dolda filer i din FTP-klient eller webbhotellets filhanterare.
Innan du redigerar, ladda ner en kopia av filen till din dator. Ett syntaxfel i.htaccess kan krascha sajten med ett 500-fel, en backup låter dig återställa på en sekund.
Öppna .htaccess i en editor och lägg till följande block före # BEGIN WordPress:
1 # Browser caching: Expires and Cache-Control headers 2 <IfModule mod_expires.c> 3 ExpiresActive On 4 5 # Images 6 ExpiresByType image/jpg "access plus 1 year" 7 ExpiresByType image/jpeg "access plus 1 year" 8 ExpiresByType image/gif "access plus 1 year" 9 ExpiresByType image/png "access plus 1 year" 10 ExpiresByType image/webp "access plus 1 year" 11 ExpiresByType image/avif "access plus 1 year" 12 ExpiresByType image/svg+xml "access plus 1 year" 13 ExpiresByType image/x-icon "access plus 1 year" 14 15 # CSS and JavaScript 16 ExpiresByType text/css "access plus 1 month" 17 ExpiresByType application/javascript "access plus 1 month" 18 19 # Fonts 20 ExpiresByType font/woff2 "access plus 1 year" 21 ExpiresByType font/woff "access plus 1 year" 22 23 # PDF and other documents 24 ExpiresByType application/pdf "access plus 1 month" 25 26 # Default 27 ExpiresDefault "access plus 2 days" 28 </IfModule> 29 30 # Cache-Control headers for modern browsers 31 <IfModule mod_headers.c> 32 <FilesMatch "\.(jpg|jpeg|png|gif|webp|avif|svg|ico|woff2|woff)$"> 33 Header set Cache-Control "max-age=31536000, public" 34 </FilesMatch> 35 <FilesMatch "\.(css|js)$"> 36 Header set Cache-Control "max-age=2592000, public" 37 </FilesMatch> 38 </IfModule>
Vad som händer här. Det första blocket <IfModule mod_expires.c> aktiverar Expires-modulen och ställer in lagringsperioder för varje filtyp. Ett år för bilder och typsnitt, de ändras nästan aldrig. En månad för CSS och JavaScript, de uppdateras med jämna mellanrum.
Det andra blocket <IfModule mod_headers.c> lägger till den moderna Cache-Control med samma perioder men i sekunder: 31536000 = ett år, 2592000 = en månad.
Viktigt: modulerna mod_expires och mod_headers måste vara aktiverade på servern. På de flesta Apache-webbhotell är de aktiva som standard: supporten aktiverar dem under den initiala installationen. Om cachelagringen inte fungerar efter att du sparat, skriv till webbhotellets support: "aktivera mod_expires och mod_headers."
Efter att du klistrat in, spara filen och ladda upp den tillbaka till sajtroten. Öppna sajten i en webbläsare, gå till DevTools (F12) → Nätverk → uppdatera sidan. Klicka på valfri CSS- eller JS-fil, under fliken Headers ska du se Expires och Cache-Control med värden som inte är noll.
Kör GTmetrix igen, felet borde vara borta.
Metod 2: pluginet AEH Speed Optimization
Om du inte vill gräva i.htaccess manuellt finns det ett plugin. Det brukade helt enkelt heta Add Expires Headers, idag har det vuxit till AEH Speed Optimization. Förutom cachelagringsheaders kan det göra CSS-minifiering, lazy loading av bilder och komprimering.

Installationssteg:
Plugins → Lägg till nytt, i sökningen skriv "AEH Speed Optimization"
Klicka på Installera nu, sedan Aktivera
Gå till Inställningar → AEH Speed Optimization
På fliken Cache-inställningar, markera filtyper och ställ in lagringsperioder i dagar

- Klicka på Skicka
Pluginet skriver regler till.htaccess själv, du behöver inte skriva en enda rad kod. För de flesta sajter räcker gratisversionen. Pro-versionen lägger till Gzip-komprimering, cachelagring av externa resurser (Google fonts, CDN-skript) och anpassade filtyper.

🔗 AEH Speed Optimization på WordPress.org
Om du redan har ett caching-plugin som W3 Total Cache eller WP Rocket, behöver du inget separat Expires-plugin. Alla seriösa cache-plugins kan lägga till Expires- och Cache-Control-headers till.htaccess automatiskt. Gå till dina plugin-inställningar och kontrollera att fliken Webbläsarcache är aktiv.
Vilken cachelagringstid ska man ställa in?
Det finns inget universellt svar, perioden beror på hur ofta du ändrar en specifik filtyp.

Filtyp | Rekommenderad period | Varför |
|---|---|---|
Bilder (jpg, png, webp, avif, gif, svg) | 1 år | Ändras sällan, väger mycket, maximal cache-nytta |
Ikoner och favicon | 1 år | Ändras inte på flera år |
Typsnitt (woff2, woff) | 1 år | Länkas in en gång och uppdateras inte |
CSS-stilar | 1 månad | Du redigerar då och då; vid omdesign, rensa cache |
JavaScript | 1 månad | Samma logik som för CSS |
PDF och dokument | 1 månad | Laddas ner sällan men kan uppdateras |
Generell regel: ju stabilare filen är, desto längre period. För bilder är ett år standard. För CSS och JS är en månad en rimlig kompromiss mellan hastighet och aktualitet.
Om du aktivt utvecklar sajten och stilar ändras varje vecka, ställ in CSS till en vecka, inte en månad. När du är klar med redigeringarna, återgå till en månad.
⁉️🤔 Vanliga frågor
Jag lade till kod i.htaccess men GTmetrix visar fortfarande felet. Varför?
Den vanligaste orsaken är att modulerna
mod_expiresellermod_headersinte är aktiverade på servern. Skriv till webbhotellets support med en begäran om att aktivera båda modulerna. Andra orsaken: du lade in kod efter# BEGIN WordPress, inte före den. WordPress skriver över allt som kommer efter dess markör. Tredje, ett caching-plugin (W3 Total Cache, WP Rocket) hanterar redan.htaccess och skrev över dina regler med sina egna. I så fall, konfigurera Webbläsarcache inuti själva pluginet, inte manuellt.
Vad är skillnaden mellan Expires och Cache-Control?
Expiresanger ett specifikt datum och klockslag ("giltig till 15 juni 2027").Cache-Controlmed direktivetmax-ageanger varaktighet i sekunder från förfrågningstillfället ("giltig i 31536000 sekunder").Cache-Controlär mer flexibelt och har prioritet: om båda är satta följer webbläsarenCache-Control. Vi rekommenderar att skriva båda för maximal kompatibilitet med gamla och nya klienter.
Sajten ligger på Nginx,.htaccess fungerar inte. Vad ska jag göra?
Filen
.htaccessär Apache-konfiguration. Nginx ignorerar den. För Nginx läggs cachelagringsregler till iserver-sektionen av sajtens konfigurationsfil med direktivetexpires. Om du har Nginx (webbhotell som Kinsta, Cloudways), använd pluginet AEH Speed Optimization: det fungerar på vilken webbserver som helst eftersom det hanterar headers via PHP, inte via serverkonfiguration.
Behöver jag konfigurera Expires om jag redan använder ett CDN?
Ja. Ett CDN (Cloudflare, BunnyCDN) cachelagrar innehåll på sina servrar världen över, men webbläsarens cache är ett separat lager. Korrekt konfigurerade
ExpiresochCache-Controlminskar förfrågningar även till CDN:et: webbläsaren går inte ut på nätverket alls för en fil om dess lokala kopia fortfarande är färsk. Två cache-lager, CDN + webbläsare, samverkar, ersätter inte varandra.
Konflikterar pluginet AEH Speed Optimization med mitt cache-plugin?
Det kan det göra om båda försöker skriva regler till.htaccess. Innan du installerar AEH Speed Optimization, inaktivera Webbläsarcache i ditt huvudsakliga caching-plugin, eller omvänt, behåll ett plugin som hanterar både sidcache och webbläsarcache. WP Rocket och W3 Total Cache kan göra allt direkt ur lådan, ett separat Expires-plugin behövs inte med dem.
Bör du konfigurera Expires manuellt eller räcker ett plugin?
Om du arbetar tryggt med FTP och inte är rädd för en kodredigerare ger manuell konfiguration via.htaccess full kontroll och lägger inte till ett extra plugin i admin. Koden ovan: kopiera, klistra in, och frågan är löst.
För alla andra löser pluginet AEH Speed Optimization uppgiften utan risk för ett skrivfel i konfigurationen. Plus att det ger minifiering och lazy loading, vilket också snabbar upp sajten.
Huvudsaken är att inte lämna GTmetrix-felet som det är. Fem minuter för att konfigurera Expires-headers ger en märkbar hastighetsökning, och hastighet är både användarupplevelse och sökrankning.



