A cache checker tells you whether a page is being served fresh from your origin server or from a cache layer sitting in front of it. Modern websites rarely talk straight to the origin on every request — a CDN like Cloudflare, a reverse proxy like Varnish or Nginx proxy_cache, or a WordPress plugin such as LiteSpeed Cache, WP Super Cache or W3 Total Cache can all quietly return a stored copy. That is great for speed, but it is exactly why a page can keep showing old content long after you have updated it.
This tool sends two real HTTP requests to your URL from our server, reads only the response headers, and reports which cache layers are involved and whether the copy you are being served may be stale. It looks at the headers that actually matter for caching — cf-cache-status, age, cache-control, expires, etag, last-modified, x-cache, x-proxy-cache, x-fastcgi-cache, x-varnish and x-litespeed-cache — and reports only what the headers show, naming the exact header as evidence rather than guessing.
Because it fires two requests about 1.5 seconds apart, it can also compare them: if the Age header keeps climbing or cf-cache-status flips from MISS to HIT, that is concrete proof a cache is serving the page. Use it when a deployment "did not take", when CSS goes missing after a cache clear, or when you simply want to confirm Cloudflare is caching what you think it is.
No login, no database, and we never log full URLs. The check runs entirely server-side — your browser never fetches the target — so it works on pages that would block a browser-based tool.
How to Use the Cache Checker
- 1
Paste the URL to test
Enter the full URL of the page you want to check, for example https://example.com/blog/my-post. If you omit the scheme we add https:// automatically. Test the exact URL users hit, including the path and any query string, since caches often key on the full URL.
- 2
Click Analyze
Our server sends two GET requests to the final URL about 1.5 seconds apart, following redirects if needed, and reads only the response headers — the page body is never downloaded. A fixed User-Agent is used and no cookies are sent.
- 3
Read the cache signals
The Cache Signals panel lists every caching header that was actually present — Cloudflare (cf-cache-status, cf-ray), Varnish (x-varnish), LiteSpeed (x-litespeed-cache) and generic ones like age, cache-control and x-cache — each shown with its real value as evidence.
- 4
Check the comparison and verdict
The comparison between request one and request two shows whether Age is increasing or cf-cache-status changed from MISS to HIT. The "What this means" panel translates the headers into plain language so you know whether to purge a cache and which layer to purge.
Understanding Cache Headers
cf-ray to every proxied response and cf-cache-status when caching is in play — HIT means it served a cached copy, MISS means it fetched from origin and may now cache it, DYNAMIC means it is not caching the page at all, BYPASS means a rule told it to skip the cache, EXPIRED/REVALIDATED/STALE describe revalidation against the origin.
Varnish advertises itself through x-varnish (transaction IDs) and often a Via header mentioning Varnish, while LiteSpeed uses x-litespeed-cache: hit or miss. The generic, server-agnostic signals are the HTTP standard ones: Cache-Control (the max-age / no-store policy the origin wants), Expires, ETag and Last-Modified (validators), and the widely used Age header, which reports how many seconds ago the shared cache stored the response. A large and growing Age is the clearest sign you are looking at a cached copy. WordPress caching plugins add their own headers such as x-wp-cf-super-cache, x-cache-enabled and x-wpo-cache, which this tool labels explicitly as plugin headers.
| Field | Description |
|---|---|
| cf-cache-status | Cloudflare cache state: HIT (served from cache), MISS (fetched from origin), DYNAMIC (not cached), BYPASS (cache skipped by rule), EXPIRED/REVALIDATED/STALE (revalidation states). |
| age | Seconds since a shared cache stored this response. A value that grows between requests is strong evidence the page is being served from cache. |
| cache-control | The caching policy requested by the origin — e.g. max-age=3600 (cacheable for an hour), no-store (never cache), private (browser only, not shared caches). |
| x-cache / x-proxy-cache | Reverse-proxy cache status set by Nginx, Varnish or a CDN — typically HIT, MISS or BYPASS. |
| x-varnish | Varnish transaction IDs. Two IDs usually mean the response was served from the Varnish cache. |
| etag / last-modified | Validators used for conditional requests so caches can revalidate instead of re-downloading unchanged content. |
Advertisement
Common Cache Checker Use Cases
A deployment did not take — the page still shows old content
You pushed an update but the live page is unchanged. Run the checker: a HIT with a large Age, or a plugin header like x-litespeed-cache: hit, tells you a specific cache layer is serving the old copy and exactly which one to purge — rather than clearing every cache blindly.
Confirming Cloudflare is actually caching
You set up a Cloudflare cache rule and want proof it works. A cf-cache-status of DYNAMIC means Cloudflare is not caching the HTML at all, while HIT on the second request confirms the rule is effective and the origin is being spared.
Diagnosing missing CSS or JS after a cache clear
When styles break after clearing a cache, stale or mismatched cached assets are usually the cause. Checking the cache headers on the CSS or JS URL shows whether an old copy is still being served and from which layer, so you can purge the right one.
Auditing a stacked cache (Cloudflare in front of Varnish)
Many setups run Cloudflare in front of Varnish or Nginx proxy_cache. Seeing cf-cache-status: DYNAMIC together with an x-varnish header reveals that Cloudflare is passing through but a cache behind it is serving the page — the kind of layered behaviour a single-request tool will miss.
Cache Checker — Frequently Asked Questions
What does cf-cache-status DYNAMIC mean?
What is the Age header in HTTP?
How do I know if Varnish is serving my page?
Why does my page show old CSS after clearing cache?
What does cf-cache-status HIT vs MISS mean?
What is the x-cache header and what values does it have?
How do I force Cloudflare to recache my page?
What does cache-control: no-store mean?
How do I check if LiteSpeed Cache is working?
Why is cf-cache-status BYPASS on my WordPress site?
Related Tools
Security Headers
Audit HSTS, CSP and other security headers on the same URL after checking its cache behaviour.
Redirect Checker
Trace the full redirect chain to confirm which final URL the cache headers belong to.
SSL Checker
Verify the TLS certificate of the host you are testing for cache behaviour.
DNS Lookup
See the A/AAAA and CNAME records to understand whether a CDN sits in front of your origin.