Hur man konfigurerar Cache-Control-huvuden i Apache

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

apache

Varje användares webbläsare använder sig av ett inbyggt cacheminne för att lagra hämtade objekt, som kan påskynda upprepade besök på din webbplats genom att de laddas från disken i stället för från nätverket. Så här konfigurerar du den i Apache.

Hur fungerar cache?

Den första gången en användare ansluter till din webbplats hämtar han eller hon alla statiska resurser som behövs för att göra upp sidan, inklusive saker som din logotyp. När de navigerar till en ny sida laddas logotypen från minnet i stället för att be om den igen, vilket ökar prestandan avsevärt och minskar belastningen på webbservern.

Detta är en cache på klientsidan, men många webbplatser använder sig också av ett Content Delivery Network, eller CDN. Ett CDN är ett nätverk av servrar som ligger framför din huvudsakliga webbserver, eller ”origin”-server. Nätverket cachas dina sidor, vilket ökar din maximala bandbredd, minskar tillgänglighetsfördröjningen och minskar belastningen på din ursprungsserver avsevärt. Om du vill veta mer om CDN:er kan du läsa vår guide om dem här.

Cache-Control är en rubrik som du kan konfigurera din webbserver att lägga till i alla utgående förfrågningar, vilket talar om för webbläsaren och CDN:erna hur de ska cacha ditt innehåll.

Reklam

Vissa sidor bör aldrig cachas av delade cacher som CDN:er. Om du gör det riskerar du att visa en användares personuppgifter för andra. Som en allmän regel gäller att om sidan kommer att vara exakt likadan för alla användare, t.ex. din startsida, kan du cachelagrafera den. Om den visar konfidentiell användarinformation bör du svartlista den från din cache. Statiska resurser, som CSS och bilder, kan vanligtvis cachelagras för alla, ofta under mycket längre tid.

Mängden tid som objektet tillbringar i cacheminnet är också viktig. Den maximala åldern för dina cachade resurser, som kallas TTL (Time-To-Live), bestämmer hur länge objektet stannar i cacheminnet innan det ogiltigförklaras och användaren uppmanas att begära ett nytt objekt. För statiska resurser som inte ändras så mycket kan du ställa in mycket höga TTL-värden, vanligtvis runt två år. För saker som du kanske vill uppdatera vill du ställa in lägre TTL-värden för att förhindra att föråldrade resurser finns i cachen för länge.

Du kan alltid använda versionerade filnamn för att utlösa en omladdning av cachen. Om du släpper en ny version av ett CSS-stilark kan du namnge den styles-1.0.1.css, och användarens webbläsare (och eventuella CDN:er framför den) kommer att se den som en ny fil som måste laddas ner på nytt. För vissa CDN:er kan du dessutom utfärda manuella invalideringar för att rensa den befintliga cachen utan att ändra filnamn.

Hur man använder Cache-Control i Apache

Cache-Control har några alternativ:

  • public – Får cachelagras av alla, inklusive webbläsare och CDN:er. Använd detta för de flesta statiska objekt.
  • private – Innehåller känsliga data som inte kan cachelagras av CDN:er eller reverse proxies. Användarens webbläsare kan cachelagra den lokalt. Använd detta för de flesta autentiserade sidor.
  • no-cache – Trots namnet inaktiveras inte caching. Webbläsaren kan fortfarande cacha svaret för att förbättra prestandan, men måste kontrollera med ursprungsservern för uppdateringar innan den används. Använd detta om du vill att användaren ska bekräfta på nytt varje gång.
  • no-store – Inaktiverar caching helt och hållet. Använd detta endast för mycket känsliga data som inte bör skickas två gånger.

Du kan dessutom lägga till no-transform-direktivet, som inaktiverar alla konverteringar som kan göras av resursen. Vissa CDN:er komprimerar till exempel bilder för att minska bandbredden. Det här direktivet inaktiverar det beteendet.

I Apache måste du ställa in den här rubriken manuellt med hjälp av Header set-direktivet, så här:

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

Värdet max-age anges i sekunder, till exempel max-age=300 för en TTL på fem minuter och max-age=63072000 för två år.

Advertisement

Du kan placera det här direktivet i roten av konfigurationen för att tillämpa det på hela webbplatsen, men en bättre metod är att tillämpa inställningarna beroende på filtypen. Om du till exempel vill ställa in en hög TTL för de flesta statiska medier kan du använda ett FilesMatch-block:

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

Om du vill svartlista en specifik sökväg från att cachelagras av CDN:er kan du använda ett Directory-block:

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

Och matcha en enda fil:

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

Blocken med de mer specifika träffarna kommer att ha företräde framför generella regexmatchningar, men du bör kontrollera att allt är korrekt inställt i den mottagande delen. Du kan kontrollera detta från Chromes DevTools, under Network > Headers.

chrome devtools network tab

Om du bara har tillgång till .htaccess-konfigurationen kan du fortfarande använda katalogmatchning genom att skapa en ny .htaccess-fil i varje underkatalog.

Använd Surrogate-Control för att ändra CDN-beteendet direkt

Surrogate-Control-huvudet fungerar precis som Cache-Control, men anger specifika instruktioner för CDN:er och reverse proxies, snarare än för slutanvändare. På så sätt kan du be CDN:er att göra en sak, men skicka olika anvisningar till webbläsaren.

Reklam

Du måste ställa in den här rubriken manuellt, på samma sätt som du ställer in Cache-Control:

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

Du bör definitivt testa med din CDN för att verifiera att det här fungerar – Surrogate-Control är ganska nytt och är inte universellt.

Anthony Heddings
Anthony Heddings är molningenjör på LifeSavvy Media, teknisk skribent, programmerare och expert på Amazons AWS-plattform. Han har skrivit hundratals artiklar för How-To Geek och CloudSavvy IT som har lästs miljontals gånger.Läs hela bio ”

Lämna ett svar

Din e-postadress kommer inte publiceras.