Let op! Deze informatie is bedoeld voor de meer technisch gevorderde lezer. Byte kan hierbij geen technische support leveren. Ben je zelf niet zo technisch? Neem dan contact op met één van onze partners, te vinden op onze Partnerpagina.

Met Expires Header en Cache-Control Header vertel je de browser hoe lang hij een bepaald bestand in zijn cache mag opslaan zonder na te gaan of er een nieuwe versie aanwezig is. Het voordeel daarvan is dat de site voor je terugkerende bezoekers sneller is én dat de serverload lager is. De code om dit in te stellen, wordt verwerkt in het .htaccess bestand.

Expires Header en Cache-Control Header fail-save code

Op onze Byte servers gebruiken we zowel Expires Header (mod_expires) als Cache-Control Header (mod_headers). Omdat dit niet bij elke provider zo hoeft te zijn, is het verstandig om onderstaand stukje code te plaatsen rondom je Expires Header en Cache-Control Header. Als een bepaalde module geladen is, dan wordt je code gelezen, anders niet.

<ifModule mod_expires.c>  
  # hier komt je Expires Header code
</ifModule>
<ifModule mod_headers.c> 
  # hier komt je Cache-Control Header code
</ifModule>

ETag en Last-modified verwijderen

Verwijder en schakel zowel ETag als Last-modified uit, omdat sommige browsers Expires Header en Cache-Control negeren als deze nog aanwezig zijn.

# remove and disable ETag
Header unset ETag
FileETag None
# remove Last-Modified
Header unset Last-Modified

Werken met Expires Header (mod_expires)

Met de module Expires Header (mod_expires) wordt de Expires HTTP header en max-age van de Cache-Control HTTP header ingesteld. De verlooptijd kan zowel relatief (bepaalde hoeveelheid sec vanaf nu) als absoluut (exacte datum) worden ingesteld.

De HTTP headers zijn een instructie aan de browser over de geldigheid van het bestand. Als de pagina in de cache opgeslagen is, dan wordt het bestand vanaf daar opgehaald in plaats van de server, totdat de cache verlopen is. Op moment dat de cache verlopen is wordt het bestand als “expired” bestempeld en moet er een nieuwe versie van de server gehaald worden.

Expires Header in combinatie met ExpiresByType

<IfModule mod_expires.c>  
  ExpiresActive On
  ExpiresDefault A600
  ExpiresByType image/x-icon A2592000
  ExpiresByType application/x-javascript A604800
  ExpiresByType text/css A604800
  ExpiresByType image/gif A2592000
  ExpiresByType image/png A2592000
  ExpiresByType image/jpeg A2592000
  ExpiresByType text/plain A86400
  ExpiresByType application/x-shockwave-flash A2592000
  ExpiresByType video/x-flv A2592000
  ExpiresByType application/pdf A2592000
  ExpiresByType text/html A600
</IfModule>

Expires Header in combinatie met FilesMatch

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault A600
  <FilesMatch \.(html|xhtml|xml|shtml)$>
    ExpiresDefault A600
  </FilesMatch>
  <FilesMatch \.(phtml|php)$>
    ExpiresDefault A1
  </FilesMatch>
  <FilesMatch \.css$>
     ExpiresDefault A604800
  </FilesMatch>
  <FilesMatch \.js$>
    ExpiresDefault A604800
  </FilesMatch>
  <FilesMatch \.(bmp|png|gif|jpe?g|ico)$>
    ExpiresDefault A2592000
  </FilesMatch>
  <FilesMatch \.(eot|ttf|otf|svg)$>
    ExpiresDefault A2592000
  </FilesMatch>
  <FilesMatch \.(swf|pdf|doc|rtf|xls|ppt)$>
    ExpiresDefault A2592000
  </FilesMatch>
  <FilesMatch \.(flv|wmv|asf|asx|wma|wax|wmx|wm)$>
    ExpiresDefault A2592000
  </FilesMatch>
</IfModule>

Werken met Cache-Control Header (mod_headers)

Met Cache-Control Header vertel je welke proxies welke content voor welke tijd kan in de cache kan opslaan. Daarnaast zijn er nog meer parameters aan te geven voor nog betere afhandeling van de cache.

<IfModule mod_headers.c>
 Header unset ETag FileETag None
 Header unset Last-Modified
 <FilesMatch \.(html|xhtml|xml|shtml|phtml|php|txt)$>
   Header set Cache-Control "max-age=600"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.css$>
   Header set Cache-Control "max-age=604800"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.js$>
   Header set Cache-Control "max-age=604800"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.(bmp|png|gif|jpe?g|ico)$>
   Header set Cache-Control "max-age=2592000"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.(eot|ttf|otf|svg)$>
   Header set Cache-Control "max-age=2592000"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.(swf|pdf|doc|rtf|xls|ppt)$>
   Header set Cache-Control "max-age=2592000"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
 <FilesMatch \.(flv|wmv|asf|asx|wma|wax|wmx|wm)$>
   Header set Cache-Control "max-age=2592000"
   Header set Cache-Control "public, no-transform"
 </FilesMatch>
</IfModule>

Extra voorbeeld voor het instellen van een lage max-age voor een txt bestand. Bijvoorbeeld in te zetten voor je robots.txt in ontwikkeling. Stel de max-age weer hoger in, zodra de ontwikkeling klaar is en de zoekmachines de nieuwe robots.txt opgehaald hebben. De optie must-revalidate is aanwezig om aan te geven dat de browser echt naar de server moet om een nieuwe versie op te halen.

<FilesMatch "\.(txt)$">
  Header set Cache-Control "max-age=0, public, must-revalidate"
</FilesMatch>

Werken met Expires Header en Cache-Control Header tezamen

Je kunt de voordelen van beide ook combineren als je dat makkelijker vindt. Zie het onderstaande voorbeeld afkomstig van AskApache.com

# Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0 
# Set up caching on media files for 1 year (forever?)
<filesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
  ExpiresDefault A29030400
  Header append Cache-Control "public"
</filesMatch> 
# Set up caching on media files for 1 week
<filesMatch "\.(gif|jpg|jpeg|png|swf)$">
  ExpiresDefault A604800
  Header append Cache-Control "public"
</filesMatch>
# Set up 2 Hour caching on commonly updated files
<filesMatch "\.(xml|txt|html|js|css)$">
  ExpiresDefault A7200
  Header append Cache-Control "proxy-revalidate"
</filesMatch> 
# Force no caching for dynamic files
<filesMatch "\.(php|cgi|pl|htm)$">
  ExpiresActive Off
  Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
  Header set Pragma "no-cache"
</filesMatch>

Header veld definities

In de header kunnen verschillende zaken ingesteld worden. De beste plek waar je kunt nalezen welke dit zijn is in het RFC2616 zelf. Hoofdstuk 14.9 gaat over Cache-Control Header.
Zie hoofdstuk 14.9 Cache-Control van RFC2616 op w3.org

64