Hurtigere hjemmeside hjælp til en langsom hjemmeside

Cache-Control forklaret

Lær hvordan Cache-Control påvirker HTML, CSS, JavaScript og billeder, og få en praktisk gennemgang af caching, TTFB og klassiske fejl.

Skrevet af Kim Tetzlaff

Cache-Control er en af de mest undervurderede performance-forbedringer, fordi den sjældent kræver store kodeændringer, men kan give tydelig effekt på både TTFB og oplevet hastighed.

Målet er enkelt: download færre ting, sjældnere, og lad browser/CDN genbruge det du allerede har sendt. God caching understøtter både TTFB og gentagne besøg - og spiller sammen med CDN og ETag, når du revaliderer i stedet for at hente hele filer igen.

Hvem er artiklen til? Folk der vil forstå hvad Cache-Control betyder i praksis på HTML vs. statiske filer, og hvordan du undgår de klassiske fejl (for kort cache på assets, for lang cache på HTML uden purge, eller cookies der ødelægger edge-cache).

Den simple tommelfingerregel

  • HTML: kortere cache (med revalidation), hvis indhold ændrer sig ofte
  • Assets (CSS/JS/billeder): lang cache hvis filnavne versioneres

Hvorfor det virker

Mindre download og hurtigere gentagne sidevisninger - og ofte lavere TTFB via edge cache.

Men for at Cache-Control virkelig hjælper, skal du skelne mellem:

  • HTML (dokumentet): ændrer sig oftere, og kan være personaliseret
  • Assets: kan ofte caches meget længe, hvis filnavne versioneres

Hvad Cache-Control egentlig styrer

Cache-Control er en HTTP-header, der fortæller caches (browser, CDN, proxies) hvad de må gøre:

  • gemme responsen
  • hvor længe den må genbruges
  • om den skal revalidere (ETag/Last-Modified)
  • om en shared cache (CDN) må cache den (public/private og s-maxage)

Det er værd at vide, at caching i praksis ofte er “lagdelt”:

  1. browser cache
  2. CDN/edge cache
  3. origin/server

Hvis du får cache rigtigt på de to første lag, rammer du færre requests på origin, og din TTFB bliver mere stabil.

max-age vs. s-maxage (browser vs. delt cache)

  • max-age: hvor længe browseren må bruge en kopi uden at spørge serveren igen (efter første svar).
  • s-maxage: “shared max-age” - typisk til CDN/proxy. Du kan derfor lade browseren revalidere ofte (max-age=0) mens edge stadig må holde en kortvarig kopi (s-maxage=…), så førstegangsbesøg tæt på edge får lavere TTFB.

Det er præcis mønsteret i HTML-eksemplet i afsnittet HTML: konservativ caching længere nede: browseren holder sig frisk, CDN’en reducerer load på origin.

stale-while-revalidate og venner

Nogle setups bruger stale-while-revalidate (se ordbog: stale-while-revalidate): brugeren får en hurtig, evt. lidt ældre kopi mens en frisk version hentes i baggrunden. Det er ikke altid aktiveret som standard - det afhænger af CDN og origin - men det er værd at kende som begreb når du læser response-headers.

Vary og hvorfor den kan ødelægge cache

Headeren Vary fortæller caches at de skal gemme flere varianter af samme URL (fx én per Accept-Language eller Cookie). Et højt Vary kan fragmentere cachen, så færre requests rammer samme nøgle. Hvis du ser mystiske cache misses, er Vary et af de første steder at kigge - sammen med unødige cookies på offentlige GET-requests.

HTML: konservativ caching der stadig giver effekt

HTML er tricky, fordi det ofte ændrer sig (nyeste indlæg, tags, menu) og nogle sites bruger cookies, A/B tests eller personalisering.

En god basis-strategi på et videnssite er:

  • HTML: max-age=0 (browser skal revalidere)
  • CDN: s-maxage på fx 10–60 minutter, hvis det er sikkert

Det giver:

  • edge hits for mange brugere (lavere TTFB)
  • mulighed for at opdatere indhold uden at brugere sidder fast på “gammel” HTML for længe

Hvis du har en purge-mekanisme, kan du ofte cache længere i CDN.

Assets: lang caching, hvis filnavne versioneres

Her ligger det største “gratis” performance-løft.

Når dine assets har versionerede filnavne (fx bundler med hash), kan du sætte:

  • Cache-Control: public, max-age=31536000, immutable

Fordelen er, at brugeren kun downloader CSS/JS igen, når du faktisk har ændret dem (nyt filnavn).

Hvis dine assets ikke er versionerede, skal du være mere forsigtig, ellers kan du få “mystiske” bugs, hvor browseren holder fast i gammel CSS/JS.

Typiske fejl (som gør caching ubrugelig)

1) Cache-busting cookies på alle sider

Hvis dit site sætter cookies på alle requests, kan nogle CDNs vælge ikke at cache HTML. Det kan gøre TTFB højere end nødvendigt.

2) HTML caches for længe uden purge

Hvis HTML ligger i edge cache i dagevis, kan du få forældet indhold. Det kan være ok for statiske sider, men sjældent for lister (blog-index, emnesider).

3) Assets caches kort, selvom de er versionerede

Det er spild. Hvis filnavn er versioneret, bør cache være lang.

4) Ingen revalidation

For HTML kan revalidation (ETag/Last-Modified) give en god balance: hurtige 304-responses, men stadig “friskhed”.

Gode og dårlige eksempler (hurtigt overblik)

SituationTypisk fornuftig headerTypisk fejl
Versioneret CSS/JS (app.a1b2.js)public, max-age=31536000, immutableKort max-age selv med hash i filnavn
Dynamisk HTML (nyhedsside)max-age=0 + kort s-maxage på CDN eller purge ved udgivelseno-store overalt → intet edge-løft
API/jsonofte no-cache / kort TTLAt cache persondata aggressivt ved en fejl

CDN, edge og klassiske CMS-/shop-scenarier

  • CDN/edge: s-maxage, purge og stale-regler skal matche jeres udgivelsesflow - ellers får I enten forældet indhold eller ingen cache-hit.
  • Cookies på HTML: session, consent eller kurv kan gøre at delt cache ikke må gemme siden - TTFB stiger for alle. Overvej at holde checkout og personlige sider adskilt fra marketing-URL’er.
  • WordPress: page cache kan sænke TTFB markant, men tjek at admin-bar, A/B-tests og «logged in» ikke utilsigtet deaktiverer cache for gæster.

En praktisk opsætning (start her)

Hvis du vil starte enkelt:

  • HTML: Cache-Control: public, max-age=0, s-maxage=600
  • Versionerede assets: Cache-Control: public, max-age=31536000, immutable

Og så tester du:

  • kold cache vs varm cache
  • forskellige geografier (edge vs origin)

Sådan tester du om caching virker

1) DevTools → Network

Kig efter:

  • from disk cache / from memory cache
  • response headers (cache-control, age, etag, last-modified)

2) WebPageTest

Kør:

  • first view
  • repeat view

Hvis repeat view ikke er markant hurtigere, er caching typisk ikke sat effektivt op.

Eksempler på fornuftige Cache-Control policies

Nedenstående er eksempler, ikke en universel sandhed. Men de er gode “startpunkter” for mange videnssites.

Versionerede assets (CSS/JS med hash i filnavn)

Når filnavnet ændrer sig ved deploy, kan du cache meget længe:

  • Cache-Control: public, max-age=31536000, immutable

Det betyder: browseren må genbruge filen i op til et år, og fordi filnavnet ændrer sig ved ny deploy, får brugeren automatisk den nye fil, når det er nødvendigt.

Billeder (statisk indhold)

Hvis dine billeder er statiske eller versionerede, kan de også caches længe. Hvis de kan ændre sig uden filnavnsskift, bør du være mere konservativ.

HTML (konservativ, men effektiv)

En simpel CDN-strategi:

  • Cache-Control: public, max-age=0, s-maxage=600

Browseren revaliderer, men CDN’et kan servere fra cache i 10 minutter. Det kan reducere TTFB markant, uden at du risikerer at sidde fast med forældet content i lang tid.

ETag og Last-Modified: hvorfor revalidation er nyttigt

For HTML er revalidation ofte den bedste balance:

  • Browseren spørger “har du noget nyere?”
  • Server/CDN svarer ofte med 304 Not Modified (billigt)

Det kan gøre gentagne besøg hurtige, selv hvis du ikke cacher HTML aggressivt.

Sådan undgår du klassiske cache-fejl

1) “Assets opdaterer ikke” efter deploy

Symptom:

  • brugere ser gammel CSS/JS
  • layout virker forkert

Årsag:

  • assets caches længe, men filnavne er ikke versionerede

Løsning:

  • versionér assets (hash)
  • eller sænk cache-tiden (mindre ideelt)

2) CDN cacher ikke HTML, selvom du tror det

Årsager kan være:

  • cookies på alle requests
  • private cache directives
  • Vary headers der splitter cachen unødigt

Løsning:

  • gør offentlige sider cachebare
  • undgå unødvendige cookies på content-sider

3) Du cacher for længe uden purge

Hvis HTML caches i timer/dage, skal du kunne purge, ellers lever du med forældet indhold.

En enkel checkliste til produktion

  • Versionerede assets har lang cache + immutable
  • HTML har en bevidst strategi (revalidation og evt. edge cache)
  • Cookies skaber ikke cache misses på offentlige sider
  • Du kan purge HTML cache ved ændringer (hvis du cacher aggressivt)
  • Du har testet first view vs repeat view

Relateret på sitet

Relaterede blogindlæg

FAQ

Er caching “kun” for gentagne besøg?

Nej. Edge caching (CDN) kan hjælpe første besøg, fordi brugeren rammer et edge node tæt på, i stedet for din origin.

Kan caching gøre SEO dårligere?

Ikke i sig selv. Risikoen opstår hvis du serverer forældet HTML i lang tid uden purge/revalidation. Brug korte TTL’er på HTML eller en purge-strategi.

Hvornår giver `no-store` mening?

`no-store` er relevant for følsomt eller personligt indhold (fx kontosider). På offentlige content-sider fjerner det ofte mulighed for edge-løft og gør performance dårligere end nødvendigt.

Næste skridt i samme emne

Fortsæt fra forklaring til handling med guides, emner og ordbog.

Om forfatteren

Kim Tetzlaff

Kim skriver og vedligeholder indhold på hurtigere-hjemmeside.dk med fokus på målelig performance, Core Web Vitals og teknisk SEO. Målet er at gøre optimering konkret: hvad der faktisk flytter tal i feltdata, og hvordan du finder den korteste vej fra symptom til fix.

Kim Tetzlaff