Slow TTFB —
Missing Caching Headers
Every page is being served fresh from the server. Every single time.
What It Is
HTTP caching headers tell browsers, CDNs, and intermediate proxies how long they can store a resource before requesting a fresh copy. When these headers are missing or misconfigured, every single request for every resource — images, CSS, JavaScript, fonts — goes back to the origin server. There's no browser cache, no CDN edge cache, no intermediate storage. Every visitor, on every page load, downloads everything from scratch from the origin server. This inflates TTFB for returning visitors and eliminates the performance benefits of CDN infrastructure.
Why It Matters
Properly configured caching headers can reduce page load times for returning visitors by 50–90% and cut origin server load by eliminating redundant requests. For sites with CDNs, missing cache headers prevent the CDN from doing its job — every request bypasses the edge cache and hits the origin. For clients on managed hosting with bandwidth costs, missing cache headers also directly increase hosting bills. This is a frequently overlooked fix that delivers significant, measurable improvements in real-user field data.
Common Causes
Understanding why this failure occurs is the first step to fixing it permanently.
No Cache-Control Headers
The server returns responses without Cache-Control headers, so browsers and CDNs default to no caching or short-lived caching. Every asset must be re-downloaded on each page visit.
Cache-Control: no-store or no-cache on Static Assets
Static assets (images, fonts, CSS) are configured with no-store or no-cache directives — often copied from API endpoint configurations. Static assets should be cached aggressively; only dynamic content needs no-cache.
Short max-age Values
Cache-Control headers exist but with max-age values of seconds or minutes rather than days or years. A max-age of 3600 (1 hour) means browsers re-download assets on every new browsing session.
CDN Not Configured to Cache HTML
The CDN is set up but configured to pass all requests through to the origin without caching HTML pages. Static assets are cached but the HTML document — which triggers all other requests — is not.
The Fix Blueprint (Interactive SOP)
Check off each step to monitor your implementation progress live!
Tools
-
Chrome DevTools Network Panel
Free | Inspect response headers on any asset to check Cache-Control, Expires, and ETag values -
WebPageTest
Free (webpagetest.org) | Repeat View test shows exactly which assets are cached and which are re-downloaded on return visits -
GTmetrix
Free tier available | Caching report flags all assets missing or misconfigured cache headers with specific fix recommendations
Time to Fix
Pro Tip
immutable in Cache-Control eliminates unnecessary revalidation requests.
Adding immutable to Cache-Control headers for versioned assets (Cache-Control: public, max-age=31536000, immutable) tells browsers not to bother checking whether the resource has changed during the max-age period — even on explicit reload. Without immutable, browsers still send conditional requests to the server to validate cached resources on reload. With immutable, those requests are eliminated entirely for properly fingerprinted assets.