Hurtigere hjemmeside hjælp til en langsom hjemmeside

Cache-Control

Cache-Control er HTTP-headeren der styrer browser- og CDN-caching. Korrekt caching kan forbedre TTFB, LCP og gentagne sidevisninger.

Skrevet af Kim Tetzlaff

Kort fortalt: Cache-Control styrer hvor længe browseren (og evt. et CDN) må genbruge en respons, før den skal hente den igen.

Hvad bruges det til?

  • Fortælle hvor længe en ressource må caches
  • Styring af revalidation (ETag/Last-Modified i kombination)

Typiske forbedringer

  • Lange cache-tider på versionerede assets (CSS/JS med hash)
  • Kortere cache på HTML hvis indhold ændrer sig ofte

I praksis er Cache-Control en af de vigtigste “grundindstillinger” for hastighed, fordi caching ændrer hvor ofte brugeren skal:

  • downloade HTML igen
  • downloade CSS/JS igen
  • downloade billeder igen

Det påvirker både første besøg (via CDN/edge caching) og gentagne besøg (via browser cache).

Hvilken indflydelse har Cache-Control?

Cache-Control påvirker typisk:

  • TTFB: hvis HTML kan leveres fra edge cache, falder TTFB ofte markant
  • LCP: hvis kritiske assets (CSS/JS/hero-billeder) caches godt, starter rendering hurtigere
  • Stabilitet: færre netværksrequests giver færre variationer mellem pageviews

På content-sites (blog, guides, ordbog) er caching ofte noget af det mest effektive, fordi mange sider er offentlige og kan caches uden personalisering.

Hvornår blev Cache-Control indført?

Cache-Control er en del af HTTP caching-modellen (HTTP/1.1) og har i mange år været den primære måde at styre caching på. Over tid er den blevet endnu vigtigere fordi:

  • CDNs og edge caching er blevet standard
  • sites loader flere assets (CSS/JS/fonts/billeder)
  • performance-krav (Core Web Vitals) gør gentagne loads og stabil levering vigtigere

Hvad betyder de vigtigste directives?

Her er de mest brugte “byggesten”:

  • max-age=<sekunder>: hvor længe en respons må caches (typisk i browser)
  • s-maxage=<sekunder>: hvor længe en respons må caches i shared caches (CDN/proxy)
  • public: respons må caches af shared caches
  • private: respons må kun caches i browser, ikke i shared caches
  • no-cache: må caches, men skal revalidere før genbrug
  • no-store: må ikke caches
  • must-revalidate: cache må ikke servere stale uden revalidation
  • stale-while-revalidate: cache må servere “stale” mens den opdaterer i baggrunden (hvis understøttet)

Du behøver ikke bruge alt. Det vigtigste er at have en enkel og korrekt politik for HTML vs assets.

HTML vs assets: den vigtigste skelnen

HTML (sider)

HTML ændrer sig oftere end versionerede assets, og det er her man typisk vil være mere konservativ.

Typiske strategier:

  • Offentlige sider: public, max-age=0, s-maxage=... + evt. revalidation
  • Hvis du kan purge cache ved ændringer: længere s-maxage på CDN kan være effektivt

Hvis du har personalisering (login, geografi, A/B tests), skal du være meget bevidst om variationer, ellers kan du cache forkert indhold til forkert bruger.

Assets (CSS/JS/billeder/fonts)

Hvis filnavnene er versionerede (fx indeholder et hash), kan du sætte meget lange cache-tider, fordi du “skifter filnavn” når indholdet ændrer sig.

Typisk:

  • public, max-age=31536000, immutable

Det er en af de mest sikre og effektive performance-forbedringer.

Typiske fejl (som giver langsomt site)

  • HTML bliver ikke cached (høj TTFB på alle requests)
  • Assets caches for kort tid (brugeren downloader alt igen)
  • Assets caches for længe uden versionering (brugere får gamle filer og “mærkelige bugs”)
  • CDN cache virker ikke pga. cookies eller varierede headers

Eksempler på “fornuftige” policies

Versionerede assets

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

HTML (konservativ)

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

HTML (mere aggressiv, hvis du kan purge)

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

FAQ

Gør Cache-Control altid et site hurtigere?

Typisk ja – men kun når det bruges korrekt i forhold til indholdstypen.

Cache-Control kan give markant effekt på **TTFB** (hvis HTML kan leveres fra edge cache) og på gentagne besøg (browser cache). Men det kan også gøre et site *langsommere at fejlsøge* eller give “mærkelige bugs”, hvis fx CSS/JS caches længe uden versions-sti (hash i filnavn), eller hvis HTML caches som om den var offentlig, men i praksis varierer med cookies/A/B-tests.

Den rigtige tilgang er at skelne mellem **HTML** (ofte konservativt) og **versionerede assets** (ofte aggressivt).

Skal man cache HTML på et videnssite?

Ofte ja, fordi indholdet er offentligt og ens for alle – og det er præcis den type sider, hvor edge cache kan give lavere TTFB.

Men du skal være bevidst om tre ting: 1) **Cookies** på alle requests kan forhindre caching eller fragmentere cache keys. 2) **Vary** kan splitte cachen i mange varianter (lav hit-rate). 3) Hvis du cacher længe, skal du have en **purge-/invalidation**-proces, ellers serverer du forældet HTML.

Hvad er den største klassiske fejl med Cache-Control?

At behandle alt ens.

Mange sætter enten “cache alt længe” (som giver risiko for forældede sider eller gamle scripts) eller “no-store overalt” (som fjerner edge-løft og gør både first view og repeat view dårligere end nødvendigt).

En robust baseline er: **lang cache på versionerede assets** og en **konservativ HTML-strategi** med revalidation/edge TTL.

Næste skridt fra begreb til handling

Guides og blogindlæg der matcher begrebets emne - ud fra fælles tags og sidens fokus.

Guide

Få edge cache-hit på HTML: undgå cookies, forkert Vary og dårlige cache keys

Mange sites har CDN, men får stadig høj TTFB fordi HTML ikke caches. Lær et praktisk workflow til at få cache-hit på offentlige sider uden at servere forkert indhold.

Guide

Forbedr TTFB med caching, edge cache og hurtigere serverrespons

Lær hvordan du reducerer TTFB med page cache, edge cache, korrekt cache strategi og bedre serverrespons på HTML.

Guide

Brug Transfer-Encoding (chunked) til progressiv rendering: hurtigere første visning

Lær at finde ud af om din server eller reverse proxy buffer HTML-svar, og få streaming (chunked) til at flytte første visning og LCP i den rigtige retning.

Blog

Range request i praksis: når 206 Partial Content ikke sker (og hvad det koster)

En feltguide til at spotte når browseren forsøger at bruge Range request, men ender med at få hele filer retur (200 i stedet for 206). Lær at se det i DevTools og ret fejl i proxy/CDN/origin.

Blog

Reverse proxy og TTFB: sådan finder du cache-, TLS- og routing-fejl i praksis

Reverse proxy-laget kan være årsagen til høj TTFB, mystiske cache misses og 502/504-fejl. Lær hvad du skal kigge efter i headers og waterfall, og få et praktisk debug-flow.

Blog

Vary-header og caching: undgå forkert indhold og lav cache-hit-rate

Vary bestemmer hvornår caches skal gemme flere varianter af samme URL (fx gzip vs brotli eller dansk vs engelsk). Lær de typiske fejl, og hvordan du tester med headers og curl.

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