Sådan konfigureres Cache-Control Headers i Apache

  • Anthony Heddings
  • 29. juli 2020, 11:00am EDT

apache

Alle brugeres browsere bruger en indbygget cache til at gemme downloadede objekter, hvilket kan fremskynde gentagne besøg på dit websted betydeligt ved at indlæse fra disken i stedet for fra netværket. Her kan du se, hvordan du konfigurerer det i Apache.

Hvordan fungerer cache?

Den første gang en bruger opretter forbindelse til dit websted, henter vedkommende alle statiske ressourcer, der er nødvendige for at gengive siden, herunder ting som dit logo. Når de navigerer til en ny side, indlæses dit logo fra hukommelsen i stedet for at bede om det igen, hvilket fremskynder ydeevnen betydeligt og reducerer belastningen på din webserver i processen.

Dette er en cache på klientsiden, men mange websteder vil også gøre brug af et Content Delivery Network, eller CDN. Et CDN er et netværk af servere, der ligger foran din primære webserver, eller “origin”-server. Dette netværk cacher dine sider, hvilket øger din maksimale båndbredde, reducerer adgangslatensiteten og mindsker belastningen af din origin-server betydeligt. Hvis du vil vide mere om CDN’er, kan du læse vores vejledning om dem her.

Cache-Control er en header, som du kan konfigurere din webserver til at tilføje til alle udgående anmodninger, hvilket fortæller browseren og CDN’erne, hvordan dit indhold skal cachelagres.

Annonce

Visse sider bør aldrig cachelagres af delte caches som CDN’er. Hvis du gør det, risikerer du at vise en brugers personlige oplysninger til andre. Som en generel regel gælder det, at hvis siden skal være nøjagtig den samme for alle brugere, f.eks. din startside, kan du cache den. Hvis den viser fortrolige brugeroplysninger, skal du sortliste den fra din cache. Statiske ressourcer, som CSS og billeder, kan normalt cachelagres for alle, ofte i meget længere tid.

Mængden af tid, som objektet bruger i cachen, er også vigtig. Omtalt som TTL (Time-To-Live) bestemmer den maksimale alder af dine cachede ressourcer, hvor længe objektet forbliver i cachen, før det bliver ugyldiggjort, og brugeren bliver bedt om at anmode om et nyt objekt. For statiske ressourcer, der ikke ændres meget, kan du indstille meget høje TTL-værdier, normalt omkring to år. For ting, som du måske ønsker at opdatere, skal du indstille lavere TTL-værdier for at forhindre, at forældede ressourcer ligger for længe i cachen.

Du kan altid bruge versionerede filnavne til at udløse en genindlæsning af cachen. Hvis du udgiver en ny version af et CSS-stilark, kan du navngive det styles-1.0.1.css, og brugerens browser (og eventuelle CDN’er foran den) vil se det som en ny fil, der skal downloades igen. Derudover kan du for nogle CDN’er udstede manuelle invalideringer for at skylle den eksisterende cache uden at ændre filnavne.

Sådan bruger du Cache-Control i Apache

Cache-Control har et par muligheder:

  • public – Kan cachelagres af alle, herunder browsere og CDN’er. Brug denne til de fleste statiske objekter.
  • private – Indeholder følsomme data, som ikke kan cachelagres af CDN’er eller reverse proxies. Brugerens browser kan cache den lokalt. Brug dette til de fleste autentificerede sider.
  • no-cache – På trods af navnet deaktiverer det ikke caching. Browseren kan stadig cache svaret af hensyn til ydeevnen, men skal tjekke med origin-serveren for opdateringer, før den bruger det. Brug dette, hvis du ønsker, at brugeren skal validere igen hver gang.
  • no-store – Deaktiverer caching helt. Brug kun dette til meget følsomme data, der ikke bør sendes to gange.

Der kan desuden tilføjes no-transform-direktivet, som deaktiverer alle konverteringer, der kan foretages på ressourcen. Nogle CDN’er komprimerer f.eks. billeder for at reducere båndbredden. Dette direktiv deaktiverer denne adfærd.

I Apache skal du indstille denne header manuelt ved hjælp af Header set-direktivet, som her:

Header set Cache-Control "max-age=84600, public"

Værdien max-age indstilles i sekunder, f.eks. max-age=300 for en TTL på fem minutter og max-age=63072000 for to år.

Annonce

Du kan placere dette direktiv i roden af din konfiguration for at anvende det på hele webstedet, men en bedre metode er at anvende indstillingerne afhængigt af filtypen. Hvis du f.eks. vil indstille en høj TTL for de fleste statiske medier, kan du bruge en FilesMatch-blok:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=63072000, public" </FilesMatch>

Hvis du ønsker at sortliste en bestemt sti fra at blive cachet af CDN’er, kan du bruge en Directory-blok:

<Directory "/private"> Header set Cache-Control "max-age=300, private" </Directory> 

Og du kan også blot matche en enkelt fil:

<File "protected.html"> Header set Cache-Control "max-age=300, private" </File>

Blokkene med de mere specifikke match har forrang for generelle regex-match, men du skal kontrollere, at alt er indstillet korrekt i den modtagende ende. Du kan kontrollere dette fra Chromes DevTools under Network > Headers.

chrome devtools network tab

Hvis du kun har adgang til .htaccess-konfiguration, kan du stadig bruge mappematching ved at oprette en ny .htaccess-fil i hver undermappe.

Brug Surrogate-Control til at ændre CDN-adfærd direkte

Den Surrogate-Control-headeren fungerer nøjagtigt som Cache-Control, men beskriver specifikke instruktioner for CDN’er og reverse proxies i stedet for slutbrugere. På denne måde kan du fortælle CDN’er, at de skal gøre én ting, men sende forskellige retninger til browseren.

Reklame

Du skal indstille denne header manuelt på samme måde, som du indstiller Cache-Control:

Header set Surrogate-Control "max-age=300, public"

Du skal helt sikkert teste med din CDN for at verificere, at dette virker – Surrogate-Control er ret nyt og er ikke universelt.

Anthony Heddings
Anthony Heddings er resident cloud-ingeniør for LifeSavvy Media, teknisk skribent, programmør og ekspert i Amazons AWS-platform. Han har skrevet hundredvis af artikler for How-To Geek og CloudSavvy IT, som er blevet læst millioner af gange.Læs hele Bio ”

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.