Overview
If you are using Cloudflare Pages to host your website, you might have noticed that static assets are not cached by the browser by default.
The Cache-Control
header in the response is set to:
public, max-age=0, must-revalidate
Which means that the browser will cache the asset, but it will check with the server on every request to see if it changed. This is not ideal for static assets that don’t change often. In fact, assets that have a hash in the filename (like main.Dsf6jfcR.js
) will never change, and can be cached indefinitely.
Solution
To configure caching, you can create a _headers
file (no extension) in the root of your pages deployment. This file will contain URL patterns and the cache settings for those patterns. For example:
# _headers file
/js/*
Cache-Control: public, max-age=31536000, immutable
/images/*
Cache-Control: public, max-age=86400
The immutable
directive tells the browser that the asset will never change, so it can be cached indefinitely. However, it’s always recommended to set a large max-age
value as well, because the immutable
directive is not supported in all browsers.
The max-age
value is in seconds, so 31536000
is one year, and 86400
is one day.
The browser will cache the asset for the specified time, and will not check with the server until the cache expires, or the cache is cleared.
See the offical documentation for more information.
Astro Framework
If you are using the Astro framework, you will notice that everything in the dist/_astro
directory has a hash in the filename. Therefore, it is safe to cache these files, because the filename will change if the content changes. Set the cache settings to immutable
for everything in the _astro
directory:
/_astro/*
Cache-Control: public, max-age=31536000, immutable