Tilbage til Forsiden
Tips og tricks· 5. oktober 2026 ·7 min læsetid

Cache-Control-overskrifter: den eneste vejledning, du rent faktisk har brug for

Cache-Control bestemmer, hvad der cachelagres, af hvem og hvor længe. Det ser kryptisk ud og er for det meste seks ord, du rent faktisk bruger. Her er de, plus den ene forskel, der rejser alle.

Mads Edelskjold
Mads Edelskjold
Grundlægger, XprotectTerm0X ex-datacenter CTO
Cache-Control-overskrifter: den eneste vejledning, du rent faktisk har brug for
Den korte version

Den Cache-Control Overskriften besvarer tre spørgsmål: Må dette cachelagres, af hvem og hvor længe. Seks direktiver dækker næsten alle tilfælde public, private, max-age, s-maxage, no-store og stale-while-revalidate. Cache fingeraftryk aktiver i et år, give HTML en kort friskhed vindue med forældet-mens-revalidere, og holde virkelig personlige svar ud af delte cacher.

Cache-Control har ry for at være en simpel løsning, mest fordi specifikationen indeholder mange direktiver, som ingen bruger. Strip det tilbage til dem, der tjener deres plads, og det er ligetil. Den kompleksitet, der er tilbage, er imidlertid reel, og den lever i en sondring, der fanger næsten alle - så vi vil komme til det tidligt.

Direktiverne er værd at kende

DirektivHvad står der?Hvem adlyder den?
publicEnhver cache kan gemme detteBrowsere og CDN'er
privateKun brugerens egen browser må gemme denKun browsere
max-age=NFrisk i n sekunderAlle
s-maxage=NFrisk i N sekunder i delte cacher, overvældende maksimal alderCDN'er og proxyer
no-storeOpbevar ikke dette noget sted, overhovedetAlle
no-cacheOpbevares, men revalideres før hver brugAlle
must-revalidateEn gang gammel, aldrig tjene uden at kontrollereAlle
immutableDette vil aldrig blive ændret; genindlæs ikke ved genindlæsningBrowsere
stale-while-revalidate=NServeres umoderne i op til N sekunder, mens du forfrisker dig bag kulisserneHovedsageligt CDN'er
stale-if-error=NServeres uaktuelt i op til N sekunder, hvis oprindelsen fejlerHovedsageligt CDN'er

no-cache betyder ikke, at du ikke skal cache

Dette er det mest misvisende navngivne direktiv i HTTP, og det er værd at være klar over. no-cache betyder "du må beholde en kopi, men du skal kontrollere oprindelsen, før du bruger den". Svaret er stadig gemt; det kan bare ikke betjenes uden en forlængelsesanmodning.

no-store Det er den, der betyder ikke cache. Hvis du vil have et svar, der aldrig er skrevet til disken noget sted, er det det direktiv, du ønsker.

Den praktiske forskel betyder noget: no-cache med en ETAg er ganske effektiv, fordi forlængelsen normalt returnerer en 304 uden krop. no-store Det betyder, at det fulde svar overføres hver eneste gang.

Den eneste forskel, der rammer alle: maks. alder vs. s-maks

Browsere og CDN'er er begge cacher, men du ønsker sjældent, at de skal indeholde indhold i samme tidsrum.

Overvej en nyhedsartikel. Du vil have dit CDN til at cachelagre det i en time, så din oprindelse er beskyttet. Du vil ikke have en besøgendes browser holder det i en time, fordi hvis du retter en fejl og rense CDN, at besøgende stadig har en forældet kopi og ingen måde for dig at nå det.

s-maxage løser dette ved kun at anvende på delte cacher:

Cache-Control: public, max-age=60, s-maxage=3600

Browseren cacher i et minut. CDN-cachen holder i en time. Du kan rense CDN og være sikker på, at alle får korrektionen inden for tres sekunder, mens din oprindelse stadig kun tjener siden en gang i timen.

Dette er den form, du ønsker for næsten alle HTML: kort i browseren, lang ved kanten, rense ved ændring. Grunden til, at det betyder noget, er, at du kan ugyldiggøre et CDN, og du kan ikke ugyldiggøre en browser.

forældet, mens-revalidere, den undervurderede én

Normalt, når et cachelagret svar udløber, venter den næste besøgende, mens cachen henter en ny kopi. Den besøgende betaler den fulde ventetid, hvilket er en lidt uretfærdig måde at fordele omkostningerne ved friskhed på.

stale-while-revalidate ændre aftalen. Inden for det angivne vindue efter udløbet tjener cachen den gamle kopi øjeblikkelig og genopfriskes i baggrunden. Ingen venter. Den næste besøgende får den nye version.

Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=86400

Dens søskende stale-if-error Det er værd at tilføje, hvor det er acceptabelt: Hvis oprindelsen returnerer en 5xx eller gange ud, skal du servere den gamle kopi snarere end en fejlside. Det er den billigste modstandsdygtighed, du nogensinde vil konfigurere - dit websted forbliver oppe gennem et oprindelsesafbrydelse, fordi kanten blev ved med at tjene, hvad den havde.

Opskrifter

  • Fingeraftryk af statiske aktiver app.a1b2c3.js, styles.d4e5f6.css

    public, max-age=31536000, immutable. Et år uden forlængelse. Sikker, fordi filnavnet ændres, når indholdet gør. immutable Derudover stopper browsere med at genoplive på en manuel genindlæsning.

  • Uaftrykte statiske filer /logo.png

    public, max-age=86400. En dag, da du ikke har andre muligheder end at vente eller omdøbe den.

  • HTML du kan rense

    public, max-age=60, s-maxage=86400, stale-while-revalidate=604800, stale-if-error=604800. Lang ved kanten, kort i browseren, renser ved udgivelse.

  • HTML du ikke kan rense

    public, max-age=300, stale-while-revalidate=3600. Kortere, da udløbet er din eneste ugyldighedsmekanisme.

  • API-svar, offentlige data

    public, max-age=0, s-maxage=60, stale-while-revalidate=300. har aldrig været pålidelig i browseren, og den er kort cachelagret ved kanten – hvilket absorberer størstedelen af dublerede anmodninger.

  • Personlige sider indkøbskurv, konto, dashboard

    private, no-store. Ikke no-cache. Intet personligt bør ligge i en delt cache under nogen omstændigheder.

  • Et tæppe no-store anvendes overalt "for at være sikker" er den mest almindelige årsag til en dårlig cache hit ratio. Det anvendes også ofte som standard for rammer, uden at nogen vælger det. Tjek, hvad din ansøgning faktisk sender, før du antager, at din konfiguration er gældende.

    ETags og forlængelse

    Cache-Control bestemmer, hvor længe noget er friskt. Når validatoren holder op med at være frisk, beslutter den, om den skal downloades igen.

    An ETag Det er et fingeraftryk af svaret. Ved forlængelse sender kunden If-None-Match med den værdi, og hvis intet ændrer serverens svar 304 Not Modified Uden krop. Last-Modified fungerer på samme måde med et tidsstempel og If-Modified-Sincemed et sekunds præcision.

    En 304 koster stadig en rundtur, hvorfor den ikke er en erstatning for en anstændig rejse max-age det sparer båndbredde, ikke ventetid. Send validatorer alligevel, fordi de gør den dyre sag meget billigere.

    Se hvad du rent faktisk sender

    curl -sI https://example.com/ | grep -iE 'cache-control|etag|age|vary'

    Kør det mod din hjemmeside, et statisk aktiv og et API-endepunkt. Den Age header fortæller dig, hvor længe svaret har siddet i en cache, hvilket er en hurtig måde at bekræfte, at CDN faktisk cacher i stedet for bare at videresende.

    Ofte stillede spørgsmål

    Hvad gør Cache-Control?

    Cache-Control er en HTTP respons header, der instruerer browsere og delte caches såsom CDNs om et svar kan gemmes, hvem kan gemme det, og hvor længe det forbliver frisk. Det er den primære mekanisme til styring af caching-adfærd, idet den har forrang frem for den ældre udløber-header.

    Hvad er forskellen mellem no-cache og no-store?

    no-cache tillader et svar, der skal gemmes, men kræver cachen til at revalidere med oprindelsen, før den serveres, så en uændret svar kan bekræftes med en letvægts 304 svar. no-store forbyder lagring af svaret overalt, hvilket betyder, at hele kroppen overføres på hver anmodning. Kun en butik uden butik forhindrer faktisk cachelagring.

    Hvad er forskellen mellem maks. alder og s-maks.

    max-age gælder for alle caches, herunder den besøgendes browser. s-maxage gælder kun for delte caches såsom CDN'er og proxyer, og tilsidesætter max-age for dem. Det almindelige mønster er en kort max-alder med en meget længere s-maxage, så CDN beskytter din oprindelse, mens browsere kun holder indhold kortvarigt - vigtigt, fordi du kan rense en CDN, men ikke kan rense en browser.

    Hvad er gammel-mens-revalidering?

    forældet-mens-revalidate definerer et vindue efter et svar udløber, hvor en cache kan tjene den forældede kopi straks, mens hente en frisk i baggrunden. Det fjerner latenstidsstraffen, der ellers falder på den besøgende, der kommer først efter udløbet, så ingen individuelle brugere venter på oprindelsen.

    Hvor længe skal jeg cachelagre statiske aktiver?

    Ét år max-age=31536000 med det uforanderlige direktiv, forudsat at filnavnene indeholder et indholdshash som app.a1b2c3.js. Da en ændring af filen giver et nyt filnavn, er der ingen risiko for forældelse. Filer uden et fingeraftryk i navnet bør bruge noget kortere, omkring en dag, da omdøbning er den eneste måde at ugyldiggøre dem på.

    Hvorfor bliver mit indhold ikke cachelagret af CDN?

    Normalt fordi svaret er no-store, privat eller max-age=0, ofte tilføjet med en standardramme i stedet for bevidst. Andre hyppige årsager er en Set-Cookie header på svar, der skal deles, eller en Vary header på noget med ubegrænsede værdier som User-Agent. Kør curl -I mod webadressen og læs de overskrifter, som din oprindelse faktisk sender.

    Indstil disse en gang pr. indholdstype, og du vil sjældent tænke på overskriften igen, hvilket er præcis, hvordan en god caching-konfiguration skal føles.

    #caching #cache-kontrol #http-overskrifter #præstation
    Sæt det i praksis

    Se, hvordan NordicCDN gør dette for dit websted:

    Mads Edelskjold
    Skrevet af
    Mads Edelskjold Grundlægger, NordicCDN ex-datacenter CTO

    Mads har arbejdet med IT – mest som vært – siden han var 16. Han tog tidligt ejerskab i en SaaS-virksomhed og var med til at udvide den til Visma, har opbygget og drevet datacenternetværk og fungeret som CTO for et dansk datacenter. Han startede NordicCDN for at gøre hurtig og sikker infrastruktur enkel at bruge.

    Få dit websted til at indlæses øjeblikkeligt

    Start gratis på to minutter – intet kort påkrævet.

    Start gratis