Tools
Cache header checker
A cache header checker reads the Cache-Control, ETag and Last-Modified headers returned for the HTML document and for the static resources a page references, and reads the cache status header a CDN returns where one is present. The question it answers is concrete: when a visitor comes back tomorrow, which files do they download again. On a site with no asset caching policy the answer is all of them, every time.
The two different jobs cache headers do
A lifetime tells the browser it may reuse the stored copy without asking. Within that window there is no request at all, which is the fastest possible outcome.
A validator — an ETag or a Last-Modified date — lets the browser ask whether its copy is still current and receive a short not-modified answer instead of the file.
A validator is much better than nothing and much worse than a lifetime: it still costs a round trip, which on a mobile connection is most of the delay.
So a resource with an ETag and no lifetime is not cached in the sense that matters. It is revalidated, on every page view, once per resource.
Why the document and the assets want opposite settings
The HTML document changes whenever the content does, and a long lifetime on it is how visitors end up reading yesterday's page. A short lifetime or a revalidation is the right answer.
Static assets with a fingerprint in the filename never change — a new build produces a new filename — so they can carry the longest lifetime the specification allows.
That pairing is the whole technique: a cheap document request that tells the browser which fingerprinted assets to use, and assets it already has.
Assets without a fingerprint cannot take a long lifetime safely, which is why build tooling adds one. An unfingerprinted asset with a year-long lifetime is a file you cannot update.
What the CDN cache status header adds
Most edge networks return a header saying whether the response came from cache. It is the only way to confirm from outside that the edge is doing its job.
A persistent miss on a static asset means the edge is forwarding every request to the origin, which is the CDN being paid for and not used.
The usual cause is the origin sending a directive that forbids shared caching, which the edge correctly obeys.
A hit on the HTML document is worth looking at rather than celebrating: it is right for a page that is the same for everyone and wrong for one that is not.
What a clean result looks like
Fingerprinted static assets carrying a long lifetime and marked immutable where supported, so the browser does not even revalidate.
The HTML document carrying a short lifetime or an explicit revalidation, with a validator so the revalidation is cheap.
A cache status header showing hits on static assets rather than misses.
An explicit directive on every response, since an absent Cache-Control leaves the decision to heuristics rather than to you.
What VeriFixScan uses
`performance.cache_control` reports whether a caching policy is declared for the entry document. `performance.static_cache` reads Cache-Control, ETag and Last-Modified really returned for static resources.
`performance.cdn_cache_status` reads the hit and miss headers really returned by the edge.
`performance.scan_limits` states how much of the inventory was measured, so an absence of findings is never read as full coverage.
The limits, stated plainly
Headers are read; browser behaviour is not simulated. What is reported is the instruction, which is what a browser acts on.
A cache status header reflects one edge node at one moment. A miss on a first request to a cold node is normal and not a finding on its own.
Whether an asset filename is fingerprinted is inferred from its shape, so an unconventional scheme may be read as unfingerprinted.
Resources outside the measurement budget are not tested, and the coverage statement reports that rather than implying they were clean.
Frequently asked questions
- I have ETags everywhere. Is my caching fine?
- Not in the sense that saves time. An ETag with no lifetime means the browser still asks about the file on every page view. It avoids re-downloading the body and it does not avoid the round trip.
- Can I put a one-year lifetime on my assets?
- On fingerprinted ones, yes — that is what the fingerprint is for. On assets served under a stable name, no: you would have no way to publish a change to visitors who already have a copy.
- My CDN reports a miss on every request. What does that mean?
- Usually that the origin sends a directive forbidding shared caching, which the edge obeys. The edge is working correctly and being given nothing to store.
Sources
Related
VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.
Scan a website