{"id":1319,"date":"2026-09-23T16:29:50","date_gmt":"2026-09-23T16:29:50","guid":{"rendered":"https:\/\/www.ahosting.net\/blog\/?p=1319"},"modified":"2026-09-23T19:02:54","modified_gmt":"2026-09-23T19:02:54","slug":"page-cache-is-not-detected","status":"publish","type":"post","link":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/","title":{"rendered":"Page Cache Is Not Detected: What WordPress Site Health Actually Checks"},"content":{"rendered":"\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"How do I fix page cache is not detected in WordPress Site Health?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Typically by finding out which of two things is missing rather than by installing another plugin. Site Health accepts a cache as present when the homepage returns one of a fixed list of caching headers, or when a cache drop-in file exists and caching is switched on in the configuration. Request your homepage three times from a terminal and read the headers. If a header saying HIT appears, your cache works and the test simply does not recognize it. If nothing appears at all, no cache is serving that page and turning one on is the actual fix.\"}}, {\"@type\": \"Question\", \"name\": \"Why does Site Health say page cache is not detected on a cached site in 2026?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Specifically because the test looks for evidence of a cache, not for the cache itself, and several popular setups no longer leave the evidence it expects. The most common one this year is LiteSpeed Cache, which stopped writing a drop-in file in version 7.4, so on those sites the only proof left is a response header. Custom proxy headers the test has never heard of, a homepage excluded from caching, and a homepage that redirects or returns an error all produce the same message on a site that is otherwise cached perfectly well.\"}}, {\"@type\": \"Question\", \"name\": \"Is page cache is not detected but the server response time is OK safe to ignore?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"In practice it is usually safe to leave for a day, and it is not safe to leave forever. That exact wording is a recommendation, not a critical result, and it means the median of three homepage requests came back under 600 milliseconds. So visitors are not waiting today. The risk is what happens under load: an uncached page runs PHP on every visit, and the fast result was measured with one request at a time. A site that answers quickly alone can still queue badly when fifty people arrive together.\"}}, {\"@type\": \"Question\", \"name\": \"Does AHosting LiteSpeed hosting ever show page cache is not detected?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"That said, it can, and it is worth being plain about when. AHosting WordPress plans run LiteSpeed with LSCache available, and a cached homepage there is marked with a response header the test recognizes. The message appears when the LiteSpeed Cache plugin is not active on the site, when the homepage has been excluded from caching, or when something on the front page sets a cookie that stops it being stored. None of those is a server fault, and each one is visible in the response headers within a minute of looking.\"}}, {\"@type\": \"Question\", \"name\": \"Page cache vs object cache: which one does this Site Health check actually measure?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"By contrast with how often the two are confused, this test measures only the page cache. A page cache stores the finished HTML so the server can skip WordPress entirely. An object cache stores the results of database queries so WordPress runs faster when it does run. Site Health checks the second one in a separate test with a separate message about a persistent object cache. Fixing one never clears the other, so read the heading of the notice before deciding which layer to work on.\"}}, {\"@type\": \"Question\", \"name\": \"LiteSpeed Cache vs a Cloudflare edge cache: which one does Site Health see?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Notably it sees whichever one answers the request its own server sends to the homepage, and that is not always the one visitors hit. The test fetches the public homepage address from inside the server. If that address resolves through the proxy, a Cloudflare HIT header can satisfy it; if it resolves straight back to the origin, only the origin cache can. Both headers are on the list. Read what the test itself was served rather than what your browser was served, because the two paths can differ.\"}}, {\"@type\": \"Question\", \"name\": \"Will an AHosting plan upgrade fix a slow page cache is not detected result in 2026?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Ultimately only if the slow half of the result is caused by the plan, and usually it is not. The critical version of this message means the median homepage response took 600 milliseconds or longer. A missing cache is the usual reason, and turning a cache on costs nothing. If the page is slow even when served from cache, the cause is in front of PHP rather than inside it. More processes and memory help an uncached site that is queuing under traffic, which is a real case but a different diagnosis.\"}}, {\"@type\": \"Question\", \"name\": \"Can I add my own cache header so the page cache check passes?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Indeed you can, and core provides a filter for exactly that purpose. The list of headers the test accepts is passed through site_status_page_cache_supported_cache_headers, so a site behind a proxy that reports its cache status under an unusual header name can register that header and a rule for reading it. Register the header your cache genuinely sends. Adding a header purely to satisfy the test hides the one signal the test exists to give you, which is whether visitors are being served from cache.\"}}, {\"@type\": \"Question\", \"name\": \"Does AHosting count cached pages against my entry process limit?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Fortunately not, and it is the practical reason a page cache matters more on shared hosting than the test result suggests. A page served from LSCache on an AHosting plan never starts PHP, so it consumes none of the concurrent PHP processes the plan allows. An uncached page consumes one for as long as it takes to build. That is why the same site can feel fine alone and stall under a burst of visitors: the limit that matters is concurrency, and caching is what keeps ordinary visits out of it.\"}}, {\"@type\": \"Question\", \"name\": \"Does page cache is not detected affect SEO or Core Web Vitals in 2026?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Interestingly the message itself affects nothing, because search engines never see Site Health. What they do see is the first byte of every page they crawl, and an uncached page is slower to produce that byte than a cached one. On a quiet site the difference can be small. On a busy one it compounds, because uncached pages queue behind each other for processes. So the notice is not a ranking problem, but the condition it describes can become one when traffic arrives.\"}}]}<\/script>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-what-page-cache-is-not-detected-actually-means\">What Page Cache Is Not Detected Actually Means<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-the-four-labels-the-page-cache-test-can-print\">The Four Labels the Page Cache Test Can Print<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-page-cache-is-not-detected-is-a-recommendation-not-a-failure\">Why Page Cache Is Not Detected Is a Recommendation, Not a Failure<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-how-site-health-decides-that-page-cache-is-not-detected\">How Site Health Decides That Page Cache Is Not Detected<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-three-requests-to-your-own-homepage\">Three Requests to Your Own Homepage<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-sixteen-headers-and-one-file\">Sixteen Headers and One File<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-the-median-and-why-one-slow-request-does-not-fail-you\">The Median, and Why One Slow Request Does Not Fail You<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-the-headers-site-health-accepts-as-proof-of-a-page-cache\">The Headers Site Health Accepts as Proof of a Page Cache<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-a-working-cache-still-shows-page-cache-is-not-detected\">Why a Working Cache Still Shows Page Cache Is Not Detected<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-litespeed-cache-stopped-writing-the-drop-in-file\">LiteSpeed Cache Stopped Writing the Drop-In File<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-a-custom-proxy-header-site-health-has-never-heard-of\">A Custom Proxy Header Site Health Has Never Heard Of<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-the-homepage-is-the-one-page-not-being-cached\">The Homepage Is the One Page Not Being Cached<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-a-staging-copy-never-runs-the-test-at-all\">A Staging Copy Never Runs the Test at All<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-site-health-can-report-a-page-cache-that-does-not-exist\">Why Site Health Can Report a Page Cache That Does Not Exist<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-three-headers-count-just-by-being-present\">Three Headers Count Just by Being Present<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-a-browser-cache-instruction-is-not-a-page-cache\">A Browser Cache Instruction Is Not a Page Cache<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-what-our-own-blog-returned-when-we-asked-three-times\">What Our Own Blog Returned When We Asked Three Times<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-a-miss-then-two-hits\">A Miss, Then Two Hits<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-what-site-health-would-make-of-it\">What Site Health Would Make of It<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-how-to-see-exactly-what-the-page-cache-test-saw\">How to See Exactly What the Page Cache Test Saw<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-repeat-the-three-requests-from-a-terminal\">Repeat the Three Requests From a Terminal<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-ask-from-inside-the-server\">Ask From Inside the Server<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-read-the-header-documentation-for-your-layer\">Read the Header Documentation for Your Layer<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-how-to-fix-page-cache-is-not-detected-on-litespeed-nginx-and-behind-a-cdn\">How to Fix Page Cache Is Not Detected on LiteSpeed, Nginx and Behind a CDN<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-fixes-by-stack-when-page-cache-is-not-detected\">Fixes by Stack When Page Cache Is Not Detected<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-registering-a-header-the-test-does-not-know\">Registering a Header the Test Does Not Know<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-when-the-slow-half-of-the-message-is-the-real-problem\">When the Slow Half of the Message Is the Real Problem<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-a-practical-checklist-for-page-cache-is-not-detected\">A Practical Checklist for Page Cache Is Not Detected<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-a-page-cache-matters-more-on-shared-hosting\">Why a Page Cache Matters More on Shared Hosting<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-where-the-work-stops-being-yours\">Where the Work Stops Being Yours<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-page-cache-is-not-detected\">Frequently Asked Questions About Page Cache Is Not Detected<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#faq-how-do-i-fix-page-cache-is-not-detected-in-wordpress\">How do I fix page cache is not detected in WordPress Site Health?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-why-does-site-health-say-page-cache-is-not-detected-in-2026\">Why does Site Health say page cache is not detected on a cached site in 2026?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-is-page-cache-is-not-detected-but-response-time-ok-safe-to-ignore\">Is page cache is not detected but the server response time is OK safe to ignore?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-does-ahosting-litespeed-hosting-show-page-cache-is-not-detected\">Does AHosting LiteSpeed hosting ever show page cache is not detected?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-page-cache-vs-object-cache-which-does-site-health-check\">Page cache vs object cache: which one does this Site Health check actually measure?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-litespeed-cache-vs-cloudflare-which-does-site-health-see\">LiteSpeed Cache vs a Cloudflare edge cache: which one does Site Health see?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-will-an-ahosting-upgrade-fix-page-cache-is-not-detected-2026\">Will an AHosting plan upgrade fix a slow page cache is not detected result in 2026?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-can-i-add-my-own-cache-header-so-the-check-passes\">Can I add my own cache header so the page cache check passes?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-does-ahosting-count-cached-pages-against-entry-processes\">Does AHosting count cached pages against my entry process limit?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#faq-does-page-cache-is-not-detected-affect-seo-in-2026\">Does page cache is not detected affect SEO or Core Web Vitals in 2026?<\/a><\/li><\/ul><\/li><\/ul><\/div>\n\n\n<div class=\"ah-tldr\">\n  <span class=\"ah-tldr-badge\">TL;DR<\/span>\n  <p>Site Health decides whether you have a page cache by requesting your homepage three times from your own server and looking for a caching header, or for a cache drop-in file. It never looks at the cache itself. So the message can appear on a site that is cached perfectly well, and it can stay silent on a site with no cache at all. Response time alone decides whether the result is a recommendation or critical. Read the headers your homepage actually returns and you will know in a minute which of the two you have.<\/p>\n<\/div>\n\n\n\n<h2 id=\"aioseo-what-page-cache-is-not-detected-actually-means\" class=\"wp-block-heading\">What Page Cache Is Not Detected Actually Means<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When WordPress Site Health prints <em>Page cache is not detected but the server response time is OK<\/em>, it is reporting the outcome of one small experiment and nothing more. Your server fetched your own homepage three times, timed each answer, and looked through the response headers for a sign that a cache had served it. It found none. That is the whole finding. It is not a measurement of your cache, which the test never inspects, and it is not a verdict on your hosting. It is a statement about which headers came back.<\/p>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/PODCAST-page-cache-is-not-detected.m4a\"><\/audio><figcaption class=\"wp-element-caption\">Listen: Site Health never looks at your cache, it reads three homepage responses for headers, so a working cache can go unseen and a site with no cache can pass. By Matt Chrust, Director of Business Development, AHosting.<\/figcaption><\/figure>\n\n\n\n<h3 id=\"aioseo-the-four-labels-the-page-cache-test-can-print\" class=\"wp-block-heading\">The Four Labels the Page Cache Test Can Print<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The same test produces four different headings, and people searching for one of them are usually looking at another. The difference matters, because two are recommendations and two are critical, and the thing that separates them is not the cache at all. It is the clock. The table below is read straight from the WordPress 7.1.2 source.<\/p>\n\n\n\n<figure class=\"wp-block-table ah-ladder\"><table><thead><tr><th>Label Site Health prints<\/th><th>Status<\/th><th>Median response time<\/th><th>Cache signal found<\/th><\/tr><\/thead><tbody><tr><td>Page cache is detected and the server response time is good<\/td><td>Good<\/td><td>Under 600 ms<\/td><td>Yes<\/td><\/tr><tr><td>Page cache is not detected but the server response time is OK<\/td><td>Recommendation<\/td><td>Under 600 ms<\/td><td>No<\/td><\/tr><tr><td>Page cache is detected but the server response time is still slow<\/td><td>Critical<\/td><td>600 ms or more<\/td><td>Yes<\/td><\/tr><tr><td>Page cache is not detected and the server response time is slow<\/td><td>Critical<\/td><td>600 ms or more<\/td><td>No<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">The four page cache results in WordPress Site Health. Speed decides the status column on its own; the cache signal only chooses between the two labels within each status. A fifth result, <em>Unable to detect the presence of page cache<\/em>, appears when a request fails outright.<\/figcaption><\/figure>\n\n\n\n<h3 id=\"aioseo-why-page-cache-is-not-detected-is-a-recommendation-not-a-failure\" class=\"wp-block-heading\">Why Page Cache Is Not Detected Is a Recommendation, Not a Failure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look at the second row again. A site can have no cache whatsoever and still land in the recommendation band, provided its homepage answers in under 600 milliseconds. And a site with a working cache lands in the critical band the moment its median crosses that line. So the common reading of this notice, that WordPress has found a problem with your cache, is backwards. It has found a fast site with no visible cache, and it is suggesting you add one before traffic makes the speed disappear.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Page Cache Is Not Detected in WordPress: What It Really Means (2026)\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/X8UF0SlgOnY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 id=\"aioseo-how-site-health-decides-that-page-cache-is-not-detected\" class=\"wp-block-heading\">How Site Health Decides That Page Cache Is Not Detected<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every guide to this message starts at the fix. Starting at the test is quicker, because the test is short, the rules are fixed, and once you know them you can predict the result without opening the dashboard. Three decisions produce every outcome: what gets requested, what counts as evidence, and which timing gets compared with the threshold.<\/p>\n\n\n\n<h3 id=\"aioseo-three-requests-to-your-own-homepage\" class=\"wp-block-heading\">Three Requests to Your Own Homepage<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The test calls your own site address, the homepage and only the homepage, three times in a row from the server itself. Each request is sent with no login cookie, so it sees what an anonymous visitor sees rather than what you see in the dashboard. If any one of the three errors, or returns a status other than 200, the test stops at once and prints <em>Unable to detect the presence of page cache<\/em>, adding that loopback requests may be the problem. That wording is exact, and we covered what sits behind it in the guide to <a href=\"https:\/\/www.ahosting.net\/blog\/your-site-could-not-complete-a-loopback-request\/\">the loopback request error<\/a>. A homepage that redirects to a login screen, or a maintenance page, ends the test here.<\/p>\n\n\n\n<h3 id=\"aioseo-sixteen-headers-and-one-file\" class=\"wp-block-heading\">Sixteen Headers and One File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For each of the three responses, WordPress walks a list of sixteen header names and records any that are present and pass their rule. Separately, it checks whether a file named <code>advanced-cache.php<\/code> exists in the content directory while caching is switched on in the configuration, which is the drop-in mechanism older cache plugins used to intercept requests. Either piece of evidence is enough. The headers from all three responses are merged into one set, so a single qualifying header on any single request counts as found for the whole test. That merge is why a cold cache usually still passes.<\/p>\n\n\n\n<h3 id=\"aioseo-the-median-and-why-one-slow-request-does-not-fail-you\" class=\"wp-block-heading\">The Median, and Why One Slow Request Does Not Fail You<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The three timings are sorted from slowest to fastest and the middle one is kept. One slow outlier, such as the first request warming an empty cache, is thrown away by construction. That middle value is then compared with 600 milliseconds, a default taken from the published guidance on time to first byte and adjustable through its own filter. The measured time includes the whole round trip from your server back to itself, connection and encryption setup included, so it is not purely the time PHP spent building the page.<\/p>\n\n\n\n<div class=\"ah-infographic\">\n  <svg viewBox=\"0 0 720 400\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"How WordPress Site Health decides whether a page cache is not detected: it requests the homepage three times, stops with an unable-to-detect result if any request fails, takes the median response time, and then combines the 600 millisecond threshold with whether a caching header or a cache drop-in was found to choose one of four labels.\">\n    <title>How Site Health decides a page cache is not detected<\/title>\n    <desc>The Site Health page cache test makes three requests to the site homepage from the server itself. If any request errors or returns a status other than 200, the result is Unable to detect the presence of page cache. Otherwise the three response times are sorted and the middle one is used. If that median is under 600 milliseconds and a caching header or a cache drop-in was found, the result is good. If it is under 600 milliseconds and nothing was found, the result is a recommendation reading Page cache is not detected but the server response time is OK. If the median is 600 milliseconds or more the result is critical whether or not a cache was found, and only the wording changes.<\/desc>\n    <rect x=\"0\" y=\"0\" width=\"720\" height=\"400\" fill=\"#0f172a\"\/>\n    <text x=\"32\" y=\"40\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"19\" font-weight=\"700\">Speed sets the status. Headers only set the words.<\/text>\n    <text x=\"32\" y=\"63\" fill=\"#eef3ff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"13\">What the Site Health page cache test does, in the order it does it.<\/text>\n    <rect x=\"32\" y=\"86\" width=\"200\" height=\"74\" fill=\"#1e293b\" stroke=\"#2563eb\" stroke-width=\"2\"\/>\n    <text x=\"46\" y=\"110\" fill=\"#60a5fa\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\" font-weight=\"700\">1. Three requests<\/text>\n    <text x=\"46\" y=\"130\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">Your server fetches your own<\/text>\n    <text x=\"46\" y=\"147\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">homepage, logged out, 3 times<\/text>\n    <rect x=\"260\" y=\"86\" width=\"200\" height=\"74\" fill=\"#1e293b\" stroke=\"#f59e0b\" stroke-width=\"2\"\/>\n    <text x=\"274\" y=\"110\" fill=\"#f59e0b\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\" font-weight=\"700\">2. Any request fails?<\/text>\n    <text x=\"274\" y=\"130\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">Error or not 200: the test stops<\/text>\n    <text x=\"274\" y=\"147\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">and reports it is unable to detect<\/text>\n    <rect x=\"488\" y=\"86\" width=\"200\" height=\"74\" fill=\"#1e293b\" stroke=\"#2563eb\" stroke-width=\"2\"\/>\n    <text x=\"502\" y=\"110\" fill=\"#60a5fa\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\" font-weight=\"700\">3. Take the median<\/text>\n    <text x=\"502\" y=\"130\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">The middle of three timings is<\/text>\n    <text x=\"502\" y=\"147\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">compared with 600 milliseconds<\/text>\n    <rect x=\"32\" y=\"188\" width=\"320\" height=\"120\" fill=\"#1e293b\" stroke=\"#334155\" stroke-width=\"1\"\/>\n    <text x=\"48\" y=\"214\" fill=\"#60a5fa\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"13\" font-weight=\"700\">Median under 600 ms<\/text>\n    <text x=\"48\" y=\"240\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">Header or drop-in found: good<\/text>\n    <text x=\"48\" y=\"262\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">Nothing found: recommendation<\/text>\n    <text x=\"48\" y=\"286\" fill=\"#93c5fd\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">&#8220;Page cache is not detected but the server<\/text>\n    <text x=\"48\" y=\"301\" fill=\"#93c5fd\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\">response time is OK&#8221;<\/text>\n    <rect x=\"368\" y=\"188\" width=\"320\" height=\"120\" fill=\"#1e293b\" stroke=\"#f59e0b\" stroke-width=\"2\"\/>\n    <text x=\"384\" y=\"214\" fill=\"#f59e0b\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"13\" font-weight=\"700\">Median 600 ms or more<\/text>\n    <text x=\"384\" y=\"240\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">Critical either way<\/text>\n    <text x=\"384\" y=\"262\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">Found: &#8220;detected but still slow&#8221;<\/text>\n    <text x=\"384\" y=\"286\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">Nothing found: &#8220;not detected and<\/text>\n    <text x=\"384\" y=\"301\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">the server response time is slow&#8221;<\/text>\n    <text x=\"32\" y=\"346\" fill=\"#ffffff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"13\" font-weight=\"700\">One HIT header on any of the three requests is enough to count as found.<\/text>\n    <text x=\"32\" y=\"368\" fill=\"#eef3ff\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"12\">So is a Last-Modified header, which proves nothing about caching at all.<\/text>\n  <\/svg>\n<\/div>\n\n\n\n<h2 id=\"aioseo-the-headers-site-health-accepts-as-proof-of-a-page-cache\" class=\"wp-block-heading\">The Headers Site Health Accepts as Proof of a Page Cache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not every header on the list is judged the same way. Some must carry a particular value, and a few count simply by existing. Knowing which is which explains most of the confusing results people report, in both directions. The table is the list as it ships in WordPress 7.1.2, grouped by the rule applied, with the software that typically sends each one.<\/p>\n\n\n\n<figure class=\"wp-block-table ah-ladder\"><table><thead><tr><th>Header<\/th><th>What makes it count<\/th><th>Typically sent by<\/th><\/tr><\/thead><tbody><tr><td><code>x-litespeed-cache<\/code><\/td><td>The value contains HIT<\/td><td>LiteSpeed web server with LSCache<\/td><\/tr><tr><td><code>cf-cache-status<\/code><\/td><td>The value contains HIT<\/td><td>Cloudflare<\/td><\/tr><tr><td><code>x-cache<\/code><\/td><td>The value contains HIT<\/td><td>Fastly and many other proxies<\/td><\/tr><tr><td><code>x-cache-status<\/code>, <code>x-proxy-cache<\/code><\/td><td>The value contains HIT<\/td><td>Nginx proxy or FastCGI cache, if configured to send it<\/td><\/tr><tr><td><code>x-srcache-fetch-status<\/code>, <code>x-srcache-store-status<\/code><\/td><td>HIT, or STORE for the second<\/td><td>OpenResty srcache module<\/td><\/tr><tr><td><code>x-varnish<\/code><\/td><td>Two or more request IDs in the value<\/td><td>Varnish<\/td><\/tr><tr><td><code>cache-control<\/code><\/td><td>A max-age of one second or more<\/td><td>Almost any server or plugin<\/td><\/tr><tr><td><code>expires<\/code><\/td><td>A date in the future<\/td><td>Almost any server or plugin<\/td><\/tr><tr><td><code>age<\/code><\/td><td>A number above zero<\/td><td>Shared caches and CDNs<\/td><\/tr><tr><td><code>last-modified<\/code>, <code>etag<\/code>, <code>via<\/code><\/td><td>Present at all, any value<\/td><td>Web servers and proxies, cached or not<\/td><\/tr><tr><td><code>x-cache-enabled<\/code>, <code>x-cache-disabled<\/code><\/td><td>true, or anything other than on<\/td><td>Rarely anything; core itself notes these seem unused<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">The AHosting Site Health Page Cache Header Map \u2014 the sixteen response headers WordPress 7.1.2 accepts as evidence of a page cache, and the rule each one must pass. The presence-only row and the cache-control row are the two that produce false results, both covered below.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"aioseo-why-a-working-cache-still-shows-page-cache-is-not-detected\" class=\"wp-block-heading\">Why a Working Cache Still Shows Page Cache Is Not Detected<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The frustrating version of page cache is not detected is the one on a site you know is cached. It happens because the test looks for evidence rather than for the cache, and several perfectly good setups no longer leave the evidence it expects. Each of the four below is visible in the response headers, and none of them is fixed by installing a second cache plugin.<\/p>\n\n\n\n<h3 id=\"aioseo-litespeed-cache-stopped-writing-the-drop-in-file\" class=\"wp-block-heading\">LiteSpeed Cache Stopped Writing the Drop-In File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For years, a cache plugin announced itself to this test by leaving <code>advanced-cache.php<\/code> behind. LiteSpeed Cache removed its use of that file in version 7.4, released in August 2025, because the plugin no longer needs it on modern WordPress. We confirmed the change in the plugin changelog and source for version 7.9.1. The consequence for this test is direct: on a LiteSpeed site the drop-in route is gone, and the only remaining proof is the <a href=\"https:\/\/docs.litespeedtech.com\/lscache\/devguide\/controls\/#x-litespeed-cache\" target=\"_blank\" rel=\"noopener\"><code>X-LiteSpeed-Cache<\/code> response header<\/a> reading hit. The plugin also registers that header, and two related ones, with Site Health through the supported filter. So if none of the three requests is served from cache, a site running LiteSpeed will show page cache is not detected even though the cache is installed.<\/p>\n\n\n\n<h3 id=\"aioseo-a-custom-proxy-header-site-health-has-never-heard-of\" class=\"wp-block-heading\">A Custom Proxy Header Site Health Has Never Heard Of<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx does not send a cache status header by default. Administrators add one, and they name it whatever they like. The widely copied examples in <a href=\"https:\/\/blog.nginx.org\/blog\/nginx-caching-guide\" target=\"_blank\" rel=\"noopener\">the NGINX caching guide<\/a> use <code>X-Cache-Status<\/code>, which is on the list, but a header named after the FastCGI cache, or after the hosting company, is not. Your cache works, visitors get cached pages, and the test reports page cache is not detected because the one header announcing it has a name WordPress was never told about.<\/p>\n\n\n\n<h3 id=\"aioseo-the-homepage-is-the-one-page-not-being-cached\" class=\"wp-block-heading\">The Homepage Is the One Page Not Being Cached<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Page cache is not detected on a cached site very often means the homepage is the exception. The test only ever requests the homepage. Sites that exclude the front page from caching, because it shows a live feed, a rotating offer or a geolocated banner, are cached everywhere else and uncached on the single address the test checks. A cache status reading MISS on all three requests is the fingerprint. So is a homepage that sets a cookie on every visit, since many caches refuse to store a response that sets one.<\/p>\n\n\n\n<h3 id=\"aioseo-a-staging-copy-never-runs-the-test-at-all\" class=\"wp-block-heading\">A Staging Copy Never Runs the Test at All<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Core only registers the page cache test when the environment type is production. On a site marked as staging or development, the test is absent rather than failing, which surprises people comparing a live site with its copy. If you are testing a cache change on <a href=\"https:\/\/www.ahosting.net\/blog\/wordpress-staging-site-hosting\/\">a staging site<\/a>, read the headers directly rather than waiting for a Site Health result that will never appear.<\/p>\n\n\n\n<h2 id=\"aioseo-why-site-health-can-report-a-page-cache-that-does-not-exist\" class=\"wp-block-heading\">Why Site Health Can Report a Page Cache That Does Not Exist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The opposite error gets less attention, and it is the more dangerous one, because a green result stops people looking. The rules that accept evidence are generous enough that a site with no page cache of any kind can pass, and the passing notice lists the headers that satisfied it without saying how weak some of them are.<\/p>\n\n\n\n<h3 id=\"aioseo-three-headers-count-just-by-being-present\" class=\"wp-block-heading\">Three Headers Count Just by Being Present<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>last-modified<\/code>, <code>etag<\/code> and <code>via<\/code>, core defines no rule at all, which means presence alone is treated as proof. None of the three indicates a page cache. A <code>Last-Modified<\/code> date can be sent by any theme or plugin that knows when a page last changed. An <code>ETag<\/code> is a version tag a server may attach to any response. A <code>Via<\/code> header only says that a proxy relayed the response, not that it stored it. Any one of them, on any one of the three requests, is enough for the test to report a cache.<\/p>\n\n\n\n<h3 id=\"aioseo-a-browser-cache-instruction-is-not-a-page-cache\" class=\"wp-block-heading\">A Browser Cache Instruction Is Not a Page Cache<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The rule for <code>cache-control<\/code> only asks for a max-age of one second or more. It does not check who the instruction is for. A response marked private, which tells shared caches not to store it and allows only the visitor\u2019s own browser to keep a copy, passes the test just as well as one a CDN is actually serving. So does a max-age that a theme adds to every response while the server still builds each page from scratch. The header describes what a cache is allowed to do, not what any cache did.<\/p>\n\n\n\n<h2 id=\"aioseo-what-our-own-blog-returned-when-we-asked-three-times\" class=\"wp-block-heading\">What Our Own Blog Returned When We Asked Three Times<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than describe in the abstract how Site Health concludes that a page cache is not detected, we ran its three requests against this blog on 23 September 2026, from outside the server the way a visitor would, and read what came back. The blog sits behind Cloudflare, which makes it a useful example: one layer, several headers, and a first request that behaves differently from the rest.<\/p>\n\n\n\n<h3 id=\"aioseo-a-miss-then-two-hits\" class=\"wp-block-heading\">A Miss, Then Two Hits<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The first request came back in 596 milliseconds with <code>cf-cache-status: MISS<\/code>, which means the edge had no stored copy and fetched one. The second and third came back in 169 and 244 milliseconds, both reading <code>cf-cache-status: HIT<\/code>. All three carried <code>cache-control: public, max-age=300<\/code> and a <code>last-modified<\/code> date. The second and third also carried <code>age: 0<\/code>, which fails its rule, because zero is not above zero. A single-request check run at the wrong moment would have reported no cache at all.<\/p>\n\n\n\n<h3 id=\"aioseo-what-site-health-would-make-of-it\" class=\"wp-block-heading\">What Site Health Would Make of It<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apply the rules and the result is easy to predict. Sorted from slowest to fastest the timings are 596, 244 and 169, so the median is 244 milliseconds, comfortably under the threshold. Three headers qualify once the responses are merged: the Cloudflare HIT, the max-age of 300, and the last-modified date. The label would be <em>Page cache is detected and the server response time is good<\/em>. Notice that two of those three would have been present with the edge cache switched off, which is the false-positive problem in miniature. The HIT is the only one that proves anything.<\/p>\n\n\n\n<h2 id=\"aioseo-how-to-see-exactly-what-the-page-cache-test-saw\" class=\"wp-block-heading\">How to See Exactly What the Page Cache Test Saw<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You do not need Site Health to reproduce its verdict, and reproducing it yourself is faster than rerunning the test from the dashboard, because you see every header rather than a summary. Three methods work, in rising order of how closely they match what the test actually receives.<\/p>\n\n\n\n<h3 id=\"aioseo-repeat-the-three-requests-from-a-terminal\" class=\"wp-block-heading\">Repeat the Three Requests From a Terminal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From any machine, run <code>curl -sI https:\/\/example.com\/<\/code> three times in a row, replacing the address with your own homepage, and compare the headers. Look for a cache status reading HIT on the second or third attempt. If you see one, a cache is serving that page. Should all three read MISS, something is stopping the homepage from being stored. When no status header appears at all, either no cache sits in front of the site or it reports under a name you will need to look up. <a href=\"https:\/\/redbot.org\/\" target=\"_blank\" rel=\"noopener\">REDbot<\/a> reads the same headers in a browser and explains each one, if a terminal is not to hand.<\/p>\n\n\n\n<h3 id=\"aioseo-ask-from-inside-the-server\" class=\"wp-block-heading\">Ask From Inside the Server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The test runs on your server, not on your laptop, and the two can take different routes. If your domain resolves straight back to the origin from inside the server, the loopback never passes through the CDN, and the CDN header you see from home will not reach the test. On a plan with shell access, running the same command on the server shows the test\u2019s own view. Without shell access, the test\u2019s summary lists the headers it detected by name, which is the same information after the fact.<\/p>\n\n\n\n<h3 id=\"aioseo-read-the-header-documentation-for-your-layer\" class=\"wp-block-heading\">Read the Header Documentation for Your Layer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every cache that sends a status header documents its values, and the values are where the surprises are. <a href=\"https:\/\/developers.cloudflare.com\/cache\/concepts\/cache-responses\/\" target=\"_blank\" rel=\"noopener\">Cloudflare\u2019s cache response reference<\/a> explains why an HTML page often reads DYNAMIC rather than MISS, which means the page was never eligible to be stored in the first place. The <a href=\"https:\/\/www.fastly.com\/documentation\/reference\/http\/http-headers\/X-Cache\/\" target=\"_blank\" rel=\"noopener\">Fastly X-Cache reference<\/a> covers the combined values a two-tier cache sends. The <a href=\"https:\/\/vinyl-cache.org\/docs\/2.1\/faq\/http.html\" target=\"_blank\" rel=\"noopener\">Varnish HTTP notes<\/a> explain why its header counts only when it carries two numbers.<\/p>\n\n\n\n<h2 id=\"aioseo-how-to-fix-page-cache-is-not-detected-on-litespeed-nginx-and-behind-a-cdn\" class=\"wp-block-heading\">How to Fix Page Cache Is Not Detected on LiteSpeed, Nginx and Behind a CDN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With the headers in front of you, the fix for page cache is not detected is specific to what they said. Enter your three observations in the predictor below to see the label Site Health will print and the first thing to change, then use the table after it to match your stack to the fix.<\/p>\n\n\n\n<style>\n.ahpc-tool{background:#0f172a;border-radius:10px;padding:22px;margin:26px 0;color:#fff;font-size:.95rem}\n.ahpc-tool h3{color:#fff;margin:0 0 6px;font-size:1.15rem}\n.ahpc-tool p.ahpc-sub{color:#eef3ff;margin:0 0 18px;font-size:.88rem}\n.ahpc-row{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:14px}\n.ahpc-f{flex:1 1 180px}\n.ahpc-f label{display:block;color:#eef3ff;font-size:.8rem;margin-bottom:5px}\n.ahpc-f select{width:100%;padding:8px;border:1px solid #334155;border-radius:6px;background:#1e293b;color:#fff;font-size:.9rem}\n.ahpc-btn{background:#2563eb;color:#fff;border:0;border-radius:6px;padding:10px 20px;font-size:.92rem;cursor:pointer;text-decoration:none;display:inline-block}\n.ahpc-out{margin-top:18px;padding:16px;background:#1e293b;border-left:4px solid #2563eb;border-radius:6px;display:none}\n.ahpc-out.ahpc-on{display:block}\n.ahpc-num{font-size:1.15rem;font-weight:700;color:#60a5fa;display:block;margin-bottom:8px}\n.ahpc-out p{margin:0 0 10px;color:#fff}\n.ahpc-out p strong{color:#93c5fd}\n.ahpc-note{color:#94a3b8;font-size:.78rem;margin-top:12px}\n<\/style>\n<div class=\"ahpc-tool\" data-ahpc=\"predictor\">\n  <h3>Site Health Page Cache Result Predictor<\/h3>\n  <p class=\"ahpc-sub\">Request your homepage three times and note what came back. Enter it here and this applies the same decision rules WordPress 7.1 uses, so you can see which label Site Health will print, why, and what to change first.<\/p>\n  <div class=\"ahpc-row\">\n    <div class=\"ahpc-f\">\n      <label for=\"ahpc-time\">Middle of the three response times<\/label>\n      <select id=\"ahpc-time\">\n        <option value=\"fast\" selected>Under 600 milliseconds<\/option>\n        <option value=\"slow\">600 milliseconds or more<\/option>\n        <option value=\"none\">A request failed or was not 200<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"ahpc-f\">\n      <label for=\"ahpc-head\">The best caching header you saw<\/label>\n      <select id=\"ahpc-head\">\n        <option value=\"hit\" selected>A cache status reading HIT<\/option>\n        <option value=\"age\">Cache-Control with max-age above zero<\/option>\n        <option value=\"weak\">Only Last-Modified, ETag or Via<\/option>\n        <option value=\"miss\">A cache status reading MISS every time<\/option>\n        <option value=\"nothing\">None of these<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"ahpc-f\">\n      <label for=\"ahpc-drop\">A cache drop-in file with caching enabled<\/label>\n      <select id=\"ahpc-drop\">\n        <option value=\"no\" selected>No, or I do not know<\/option>\n        <option value=\"yes\">Yes<\/option>\n      <\/select>\n    <\/div>\n  <\/div>\n  <button class=\"ahpc-btn wp-element-button\" id=\"ahpc-go\" type=\"button\">Predict the result<\/button>\n  <div class=\"ahpc-out\" id=\"ahpc-out\">\n    <span class=\"ahpc-num\" id=\"ahpc-num\">&#8212;<\/span>\n    <p><strong>Status:<\/strong> <span id=\"ahpc-status\"><\/span><\/p>\n    <p><strong>Why:<\/strong> <span id=\"ahpc-why\"><\/span><\/p>\n    <p><strong>Do this first:<\/strong> <span id=\"ahpc-first\"><\/span><\/p>\n    <p class=\"ahpc-note\">This mirrors the rules in the WordPress 7.1.2 source and nothing else, so it cannot see your site. A plugin can add headers to the accepted list, which would change the result for the better.<\/p>\n  <\/div>\n<\/div>\n<script>\n(function(){\n  document.addEventListener('DOMContentLoaded', function(){\n    var tool = document.querySelector('[data-ahpc]');\n    if (!tool) { return; }\n    var mode = tool.getAttribute('data-ahpc');\n    if (mode !== 'predictor') { return; }\n    var go = document.getElementById('ahpc-go');\n    if (!go) { return; }\n    var out = document.getElementById('ahpc-out');\n    if (!out) { return; }\n    var num = document.getElementById('ahpc-num');\n    if (!num) { return; }\n    var st = document.getElementById('ahpc-status');\n    if (!st) { return; }\n    var why = document.getElementById('ahpc-why');\n    if (!why) { return; }\n    var first = document.getElementById('ahpc-first');\n    if (!first) { return; }\n    var FOUND = {};\n    FOUND['hit'] = true;\n    FOUND['age'] = true;\n    FOUND['weak'] = true;\n    FOUND['miss'] = false;\n    FOUND['nothing'] = false;\n    go.addEventListener('click', function(){\n      var t = document.getElementById('ahpc-time');\n      if (!t) { return; }\n      var h = document.getElementById('ahpc-head');\n      if (!h) { return; }\n      var dr = document.getElementById('ahpc-drop');\n      if (!dr) { return; }\n      var found = FOUND[h.value];\n      if (dr.value === 'yes') { found = true; }\n      var label = '';\n      var status = '';\n      var reason = '';\n      var fix = '';\n      if (t.value === 'none') {\n        label = 'Unable to detect the presence of page cache';\n        status = 'Recommendation. The test never reached the header check.';\n        reason = 'One of the three requests errored or returned something other than 200, so the test stopped and blamed the loopback request.';\n        fix = 'Fix the loopback request first. Until your server can fetch its own homepage, no cache result means anything.';\n      } else if (t.value === 'fast') {\n        if (found) {\n          label = 'Page cache is detected and the server response time is good';\n          status = 'Good.';\n          reason = 'The median came in under 600 milliseconds and at least one accepted signal was present.';\n          fix = 'Nothing, unless the only signal was Last-Modified, ETag or Via. Those count on presence alone, so confirm a real cache status header before trusting this.';\n        } else {\n          label = 'Page cache is not detected but the server response time is OK';\n          status = 'Recommendation.';\n          reason = 'The median was fast, but no accepted header and no active drop-in was found.';\n          fix = 'If you saw MISS on all three requests, check that the homepage is not excluded from caching. If you saw nothing, turn a page cache on.';\n        }\n      } else {\n        status = 'Critical, whatever the cache signal.';\n        if (found) {\n          label = 'Page cache is detected but the server response time is still slow';\n          reason = 'A signal was present, but the median took 600 milliseconds or more, and speed alone sets the status.';\n          fix = 'Check whether the three requests were actually served from cache. A HIT that is still slow points at the network or TLS, not PHP.';\n        } else {\n          label = 'Page cache is not detected and the server response time is slow';\n          reason = 'No signal was found and the median took 600 milliseconds or more.';\n          fix = 'Turn a page cache on before anything else. It usually fixes both halves of this message at once.';\n        }\n      }\n      num.innerHTML = label;\n      st.innerHTML = status;\n      why.innerHTML = reason;\n      first.innerHTML = fix;\n      out.className = 'ahpc-out ahpc-on';\n    });\n  });\n})();\n<\/script>\n\n\n\n<h3 id=\"aioseo-fixes-by-stack-when-page-cache-is-not-detected\" class=\"wp-block-heading\">Fixes by Stack When Page Cache Is Not Detected<\/h3>\n\n\n\n<figure class=\"wp-block-table ah-ladder\"><table><thead><tr><th>What your headers showed<\/th><th>Likely cause<\/th><th>Fix<\/th><th>What not to do<\/th><\/tr><\/thead><tbody><tr><td>LiteSpeed server, no <code>x-litespeed-cache<\/code> header at all<\/td><td>The LiteSpeed Cache plugin is not active, so nothing tells the server what to store<\/td><td>Activate the plugin and enable caching, then request the homepage twice<\/td><td>Install a second cache plugin alongside it<\/td><\/tr><tr><td><code>x-litespeed-cache: miss<\/code> on every request<\/td><td>Homepage excluded, a cookie set on every visit, or a cache purged by each test run<\/td><td>Check the exclusion lists and look for a plugin that sets a cookie on the front page<\/td><td>Assume the server cache is broken<\/td><\/tr><tr><td>Nginx cache working, but its status header has a custom name<\/td><td>The header is not on the accepted list<\/td><td>Rename it to <code>X-Cache-Status<\/code>, or register it through the filter<\/td><td>Add a fake header that does not track the real cache state<\/td><\/tr><tr><td>Cloudflare reads <code>DYNAMIC<\/code> on the homepage<\/td><td>HTML is not eligible for edge caching under the current rules<\/td><td>Add a cache rule for HTML with the admin and login paths excluded<\/td><td>Cache every path including the admin area<\/td><\/tr><tr><td>No caching headers of any kind, from any layer<\/td><td>No page cache exists<\/td><td>Turn one on at the server level where the host provides it<\/td><td>Stack two page caches that each hold their own copy<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Fixes for page cache is not detected, by what the response headers showed. The last column matters as much as the fix: every entry in it makes the message go away while leaving the site no faster, or slower.<\/figcaption><\/figure>\n\n\n\n<h3 id=\"aioseo-registering-a-header-the-test-does-not-know\" class=\"wp-block-heading\">Registering a Header the Test Does Not Know<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When your cache works and simply reports under an unfamiliar name, core offers <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/site_status_page_cache_supported_cache_headers\/\" target=\"_blank\" rel=\"noopener\">the <code>site_status_page_cache_supported_cache_headers<\/code> filter<\/a> for exactly this case. A short snippet in a site plugin adds the header and a rule for reading it, for example <code>$headers['x-fastcgi-cache'] = function ( $v ) { return false !== stripos( $v, 'hit' ); };<\/code> followed by returning the array. Register the header your cache genuinely sends and read its real HIT value. A rule that returns true for any value turns the test into a decoration.<\/p>\n\n\n\n<h3 id=\"aioseo-when-the-slow-half-of-the-message-is-the-real-problem\" class=\"wp-block-heading\">When the Slow Half of the Message Is the Real Problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If the label ends in <em>response time is slow<\/em>, the status is critical and the cache is only half the story. An uncached homepage that takes 600 milliseconds or more is usually waiting on PHP and the database, and a page cache fixes that by skipping both. A cached homepage that is still slow is waiting on something in front of PHP, and caching harder will not help. We separated those two cases in detail in the guide to <a href=\"https:\/\/www.ahosting.net\/blog\/reduce-ttfb-wordpress-server-vs-plugins\/\">reducing time to first byte<\/a>, and the split there applies directly to this result.<\/p>\n\n\n\n<h2 id=\"aioseo-a-practical-checklist-for-page-cache-is-not-detected\" class=\"wp-block-heading\">A Practical Checklist for Page Cache Is Not Detected<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Read the full heading, not the first four words. Recommendation or critical is decided by the median response time, and that tells you whether this is urgent.<\/li>\n\n\n\n<li>Request your homepage three times and note every caching header. A HIT on any request means a cache is working and the test is failing to recognize it.<\/li>\n\n\n\n<li>If a request fails or returns anything other than 200, fix the loopback or the redirect before touching the cache.<\/li>\n\n\n\n<li>On LiteSpeed, confirm the LiteSpeed Cache plugin is active, because the drop-in file the test once looked for no longer exists.<\/li>\n\n\n\n<li>On a custom proxy, compare its status header name with the accepted list, and rename it or register it if it is missing.<\/li>\n\n\n\n<li>If the only headers are Last-Modified, ETag or Via, treat a passing result as unproven until a real cache status header appears.<\/li>\n\n\n\n<li>After any change, request the homepage twice more and confirm the second request reads HIT before rerunning Site Health.<\/li>\n<\/ol>\n\n\n\n<h3 id=\"aioseo-why-a-page-cache-matters-more-on-shared-hosting\" class=\"wp-block-heading\">Why a Page Cache Matters More on Shared Hosting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A fast result reading page cache is not detected is real, and it is also a measurement of one visitor at a time. What an uncached page costs on shared hosting is concurrency. Every uncached visit holds one PHP process for as long as the page takes to build, and <a href=\"https:\/\/www.ahosting.net\/web-hosting.html\">our shared hosting plans<\/a> publish that ceiling rather than hiding it: up to 30 concurrent PHP processes on Bronze and 40 on Silver. A burst of visitors to an uncached homepage fills those quickly, and the symptom is the queueing we traced in the guide to <a href=\"https:\/\/www.ahosting.net\/blog\/wordpress-php-workers-503-errors-2026\/\">PHP workers and 503 errors<\/a>. A cached visit holds none of them.<\/p>\n\n\n\n<h3 id=\"aioseo-where-the-work-stops-being-yours\" class=\"wp-block-heading\">Where the Work Stops Being Yours<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What we take off your hands is the layer the test is looking for. Every one of <a href=\"https:\/\/www.ahosting.net\/wordpress-hosting.html\">our WordPress plans<\/a> runs on LiteSpeed with LSCache included, and a page served from LSCache consumes no PHP process at all, so the ceiling above is reserved for the requests that genuinely need PHP. The headers, the exclusions and the plugin switch are yours to check, and this guide covers all of them. Where a store is doing the work, <a href=\"https:\/\/www.ahosting.net\/woocommerce-hosting.html\">the WooCommerce plans<\/a> start from a larger allocation, because carts and checkouts can never be served from cache. And where a site has outgrown shared limits even with caching on, <a href=\"https:\/\/www.ahosting.net\/vps-hosting.html\">a VPS<\/a> is the honest next step.<\/p>\n\n\n\n<h2 id=\"faq-page-cache-is-not-detected\" class=\"wp-block-heading\">Frequently Asked Questions About Page Cache Is Not Detected<\/h2>\n\n\n\n<h3 id=\"faq-how-do-i-fix-page-cache-is-not-detected-in-wordpress\" class=\"wp-block-heading\">How do I fix page cache is not detected in WordPress Site Health?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Typically by finding out which of two things is missing rather than by installing another plugin. Site Health accepts a cache as present when the homepage returns one of a fixed list of caching headers, or when a cache drop-in file exists and caching is switched on in the configuration. Request your homepage three times from a terminal and read the headers. If a header saying HIT appears, your cache works and the test simply does not recognize it. If nothing appears at all, no cache is serving that page and turning one on is the actual fix.<\/p>\n\n\n\n<h3 id=\"faq-why-does-site-health-say-page-cache-is-not-detected-in-2026\" class=\"wp-block-heading\">Why does Site Health say page cache is not detected on a cached site in 2026?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Specifically because the test looks for evidence of a cache, not for the cache itself, and several popular setups no longer leave the evidence it expects. The most common one this year is LiteSpeed Cache, which stopped writing a drop-in file in version 7.4, so on those sites the only proof left is a response header. Custom proxy headers the test has never heard of, a homepage excluded from caching, and a homepage that redirects or returns an error all produce the same message on a site that is otherwise cached perfectly well.<\/p>\n\n\n\n<h3 id=\"faq-is-page-cache-is-not-detected-but-response-time-ok-safe-to-ignore\" class=\"wp-block-heading\">Is page cache is not detected but the server response time is OK safe to ignore?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In practice it is usually safe to leave for a day, and it is not safe to leave forever. That exact wording is a recommendation, not a critical result, and it means the median of three homepage requests came back under 600 milliseconds. So visitors are not waiting today. The risk is what happens under load: an uncached page runs PHP on every visit, and the fast result was measured with one request at a time. A site that answers quickly alone can still queue badly when fifty people arrive together.<\/p>\n\n\n\n<h3 id=\"faq-does-ahosting-litespeed-hosting-show-page-cache-is-not-detected\" class=\"wp-block-heading\">Does AHosting LiteSpeed hosting ever show page cache is not detected?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">That said, it can, and it is worth being plain about when. AHosting WordPress plans run LiteSpeed with LSCache available, and a cached homepage there is marked with a response header the test recognizes. The message appears when the LiteSpeed Cache plugin is not active on the site, when the homepage has been excluded from caching, or when something on the front page sets a cookie that stops it being stored. None of those is a server fault, and each one is visible in the response headers within a minute of looking.<\/p>\n\n\n\n<h3 id=\"faq-page-cache-vs-object-cache-which-does-site-health-check\" class=\"wp-block-heading\">Page cache vs object cache: which one does this Site Health check actually measure?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By contrast with how often the two are confused, this test measures only the page cache. A page cache stores the finished HTML so the server can skip WordPress entirely. An object cache stores the results of database queries so WordPress runs faster when it does run. Site Health checks the second one in a separate test with a separate message about a persistent object cache. Fixing one never clears the other, so read the heading of the notice before deciding which layer to work on.<\/p>\n\n\n\n<h3 id=\"faq-litespeed-cache-vs-cloudflare-which-does-site-health-see\" class=\"wp-block-heading\">LiteSpeed Cache vs a Cloudflare edge cache: which one does Site Health see?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Notably it sees whichever one answers the request its own server sends to the homepage, and that is not always the one visitors hit. The test fetches the public homepage address from inside the server. If that address resolves through the proxy, a Cloudflare HIT header can satisfy it; if it resolves straight back to the origin, only the origin cache can. Both headers are on the list. Read what the test itself was served rather than what your browser was served, because the two paths can differ.<\/p>\n\n\n\n<h3 id=\"faq-will-an-ahosting-upgrade-fix-page-cache-is-not-detected-2026\" class=\"wp-block-heading\">Will an AHosting plan upgrade fix a slow page cache is not detected result in 2026?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ultimately only if the slow half of the result is caused by the plan, and usually it is not. The critical version of this message means the median homepage response took 600 milliseconds or longer. A missing cache is the usual reason, and turning a cache on costs nothing. If the page is slow even when served from cache, the cause is in front of PHP rather than inside it. More processes and memory help an uncached site that is queuing under traffic, which is a real case but a different diagnosis.<\/p>\n\n\n\n<h3 id=\"faq-can-i-add-my-own-cache-header-so-the-check-passes\" class=\"wp-block-heading\">Can I add my own cache header so the page cache check passes?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Indeed you can, and core provides a filter for exactly that purpose. The list of headers the test accepts is passed through site_status_page_cache_supported_cache_headers, so a site behind a proxy that reports its cache status under an unusual header name can register that header and a rule for reading it. Register the header your cache genuinely sends. Adding a header purely to satisfy the test hides the one signal the test exists to give you, which is whether visitors are being served from cache.<\/p>\n\n\n\n<h3 id=\"faq-does-ahosting-count-cached-pages-against-entry-processes\" class=\"wp-block-heading\">Does AHosting count cached pages against my entry process limit?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fortunately not, and it is the practical reason a page cache matters more on shared hosting than the test result suggests. A page served from LSCache on an AHosting plan never starts PHP, so it consumes none of the concurrent PHP processes the plan allows. An uncached page consumes one for as long as it takes to build. That is why the same site can feel fine alone and stall under a burst of visitors: the limit that matters is concurrency, and caching is what keeps ordinary visits out of it.<\/p>\n\n\n\n<h3 id=\"faq-does-page-cache-is-not-detected-affect-seo-in-2026\" class=\"wp-block-heading\">Does page cache is not detected affect SEO or Core Web Vitals in 2026?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Interestingly the message itself affects nothing, because search engines never see Site Health. What they do see is the first byte of every page they crawl, and an uncached page is slower to produce that byte than a cached one. On a quiet site the difference can be small. On a busy one it compounds, because uncached pages queue behind each other for processes. So the notice is not a ranking problem, but the condition it describes can become one when traffic arrives.<\/p>\n\n\n\n<script>\n(function(){\n  document.addEventListener('DOMContentLoaded', function(){\n    var allH3s = document.querySelectorAll('h3.wp-block-heading');\n    var inFaq = false;\n    for (var i = 0; i < allH3s.length; i++) {\n      var h3 = allH3s[i];\n      var prev = h3.previousElementSibling;\n      if (prev) {\n        if (prev.tagName === 'H2') {\n          var prevId = prev.getAttribute('id');\n          if (prevId) {\n            if (prevId.indexOf('faq-') === 0) {\n              inFaq = true;\n            } else {\n              inFaq = false;\n            }\n          }\n        }\n      }\n      if (inFaq) {\n        initToggle(h3);\n      }\n    }\n    function initToggle(h3) {\n      var answer = h3.nextElementSibling;\n      if (!answer) { return; }\n      if (answer.tagName !== 'P') { return; }\n      answer.style.display = 'none';\n      h3.style.cursor = 'pointer';\n      h3.setAttribute('tabindex', '0');\n      h3.setAttribute('aria-expanded', 'false');\n      h3.addEventListener('click', function(){\n        toggleOne(h3, answer);\n      });\n      h3.addEventListener('keydown', function(ev){\n        if (ev.key === 'Enter') { toggleOne(h3, answer); }\n        if (ev.key === ' ') { ev.preventDefault(); toggleOne(h3, answer); }\n      });\n    }\n    function toggleOne(h3, answer) {\n      var open = h3.getAttribute('aria-expanded') === 'true';\n      if (open) {\n        answer.style.display = 'none';\n        h3.setAttribute('aria-expanded', 'false');\n      } else {\n        answer.style.display = 'block';\n        h3.setAttribute('aria-expanded', 'true');\n      }\n    }\n  });\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR Site Health decides whether you have a page cache by requesting your homepage three times from your own server and looking for a caching header, or for a cache drop-in file. It never looks at the cache itself. So the message can appear on a site that is cached perfectly well, and it can [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1320,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[8],"tags":[68,231,70,79,295,110,276,73,113],"class_list":["post-1319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress","tag-caching","tag-cloudflare","tag-litespeed","tag-lscache","tag-page-cache-is-not-detected","tag-shared-hosting","tag-site-health","tag-ttfb","tag-wordpress-errors"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Matt Chrust\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"AHosting Blog | WordPress Hosting Tips &amp; Guides\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Fix: Page Cache Is Not Detected in Site Health | AHosting\" \/>\n\t\t<meta property=\"og:description\" content=\"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-09-23T16:29:50+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-23T19:02:54+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@ahostingdotnet\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Fix: Page Cache Is Not Detected in Site Health | AHosting\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@ahostingdotnet\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#article\",\"name\":\"Fix: Page Cache Is Not Detected in Site Health | AHosting\",\"headline\":\"Page Cache Is Not Detected: What WordPress Site Health Actually Checks\",\"author\":{\"@type\":\"Person\",\"name\":\"Matt Chrust\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/author\\\/matt-chrust\\\/\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/page-cache-is-not-detected-ahosting.jpg\",\"width\":1200,\"height\":675,\"caption\":\"Site Health never inspects the cache. It reads the headers on three homepage requests, and some of the headers it accepts prove nothing at all.\"},\"datePublished\":\"2026-09-23T16:29:50+00:00\",\"dateModified\":\"2026-09-23T19:02:54+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#webpage\"},\"articleSection\":\"WordPress, Caching, Cloudflare, LiteSpeed, LSCache, page cache is not detected, Shared Hosting, Site Health, TTFB, WordPress errors\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/category\\\/wordpress\\\/#listItem\",\"name\":\"WordPress\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/category\\\/wordpress\\\/#listItem\",\"position\":2,\"name\":\"WordPress\",\"item\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/category\\\/wordpress\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#listItem\",\"name\":\"Page Cache Is Not Detected: What WordPress Site Health Actually Checks\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#listItem\",\"position\":3,\"name\":\"Page Cache Is Not Detected: What WordPress Site Health Actually Checks\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/category\\\/wordpress\\\/#listItem\",\"name\":\"WordPress\"},\"item\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/\"}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/#organization\",\"name\":\"AHosting\",\"description\":\"WordPress Hosting Tips & Guides\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/assets\\\/img\\\/ahosting-logo.svg\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#organizationLogo\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/ahostingdotnet\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/author\\\/matt-chrust\\\/#author\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/author\\\/matt-chrust\\\/\",\"name\":\"Matt Chrust\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/795895edac1c44589f6c7f5e6bb79df405fbbaac15817bdd387ec57da61731ec?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Matt Chrust\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#webpage\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/\",\"name\":\"Fix: Page Cache Is Not Detected in Site Health | AHosting\",\"description\":\"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/author\\\/matt-chrust\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/author\\\/matt-chrust\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/page-cache-is-not-detected-ahosting.jpg\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#mainImage\",\"width\":1200,\"height\":675,\"caption\":\"Site Health never inspects the cache. It reads the headers on three homepage requests, and some of the headers it accepts prove nothing at all.\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/blog\\\/page-cache-is-not-detected\\\/#mainImage\"},\"datePublished\":\"2026-09-23T16:29:50+00:00\",\"dateModified\":\"2026-09-23T19:02:54+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/#website\",\"url\":\"https:\\\/\\\/www.ahosting.net\\\/\",\"name\":\"AHosting\",\"description\":\"WordPress Hosting Tips & Guides\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ahosting.net\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Fix: Page Cache Is Not Detected in Site Health | AHosting","description":"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.","canonical_url":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#article","name":"Fix: Page Cache Is Not Detected in Site Health | AHosting","headline":"Page Cache Is Not Detected: What WordPress Site Health Actually Checks","author":{"@type":"Person","name":"Matt Chrust","url":"https:\/\/www.ahosting.net\/blog\/author\/matt-chrust\/"},"publisher":{"@id":"https:\/\/www.ahosting.net\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg","width":1200,"height":675,"caption":"Site Health never inspects the cache. It reads the headers on three homepage requests, and some of the headers it accepts prove nothing at all."},"datePublished":"2026-09-23T16:29:50+00:00","dateModified":"2026-09-23T19:02:54+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#webpage"},"isPartOf":{"@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#webpage"},"articleSection":"WordPress, Caching, Cloudflare, LiteSpeed, LSCache, page cache is not detected, Shared Hosting, Site Health, TTFB, WordPress errors"},{"@type":"BreadcrumbList","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/#listItem","position":1,"name":"Home","item":"https:\/\/www.ahosting.net\/blog\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/#listItem","name":"WordPress"}},{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/#listItem","position":2,"name":"WordPress","item":"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#listItem","name":"Page Cache Is Not Detected: What WordPress Site Health Actually Checks"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#listItem","position":3,"name":"Page Cache Is Not Detected: What WordPress Site Health Actually Checks","previousItem":{"@type":"ListItem","@id":"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/#listItem","name":"WordPress"},"item":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/"}]},{"@type":"Organization","@id":"https:\/\/www.ahosting.net\/#organization","name":"AHosting","description":"WordPress Hosting Tips & Guides","url":"https:\/\/www.ahosting.net\/","logo":{"@type":"ImageObject","url":"https:\/\/www.ahosting.net\/assets\/img\/ahosting-logo.svg","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#organizationLogo"},"image":{"@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#organizationLogo"},"sameAs":["https:\/\/x.com\/ahostingdotnet"]},{"@type":"Person","@id":"https:\/\/www.ahosting.net\/blog\/author\/matt-chrust\/#author","url":"https:\/\/www.ahosting.net\/blog\/author\/matt-chrust\/","name":"Matt Chrust","image":{"@type":"ImageObject","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/795895edac1c44589f6c7f5e6bb79df405fbbaac15817bdd387ec57da61731ec?s=96&d=mm&r=g","width":96,"height":96,"caption":"Matt Chrust"}},{"@type":"WebPage","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#webpage","url":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/","name":"Fix: Page Cache Is Not Detected in Site Health | AHosting","description":"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.ahosting.net\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#breadcrumblist"},"author":{"@id":"https:\/\/www.ahosting.net\/blog\/author\/matt-chrust\/#author"},"creator":{"@id":"https:\/\/www.ahosting.net\/blog\/author\/matt-chrust\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg","@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#mainImage","width":1200,"height":675,"caption":"Site Health never inspects the cache. It reads the headers on three homepage requests, and some of the headers it accepts prove nothing at all."},"primaryImageOfPage":{"@id":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/#mainImage"},"datePublished":"2026-09-23T16:29:50+00:00","dateModified":"2026-09-23T19:02:54+00:00"},{"@type":"WebSite","@id":"https:\/\/www.ahosting.net\/#website","url":"https:\/\/www.ahosting.net\/","name":"AHosting","description":"WordPress Hosting Tips & Guides","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.ahosting.net\/#organization"}}]},"og:locale":"en_US","og:site_name":"AHosting Blog | WordPress Hosting Tips &amp; Guides","og:type":"article","og:title":"Fix: Page Cache Is Not Detected in Site Health | AHosting","og:description":"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.","og:url":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/","og:image":"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg","og:image:secure_url":"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg","og:image:width":1200,"og:image:height":675,"article:published_time":"2026-09-23T16:29:50+00:00","article:modified_time":"2026-09-23T19:02:54+00:00","twitter:card":"summary_large_image","twitter:site":"@ahostingdotnet","twitter:title":"Fix: Page Cache Is Not Detected in Site Health | AHosting","twitter:description":"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.","twitter:creator":"@ahostingdotnet","twitter:image":"https:\/\/www.ahosting.net\/blog\/wp-content\/uploads\/2026\/09\/page-cache-is-not-detected-ahosting.jpg"},"aioseo_meta_data":{"post_id":"1319","title":"Fix: Page Cache Is Not Detected in Site Health | AHosting","description":"Site Health says page cache is not detected? It never inspects your cache. It reads three homepage responses for headers. Here is what it accepts.","keywords":null,"keyphrases":{"focus":{"keyphrase":"page cache is not detected","score":0,"analysis":[]},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-09-23 16:23:46","updated":"2026-09-23 19:05:02","seo_analyzer_scan_date":null,"focus_keyword":"page cache is not detected","additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.ahosting.net\/blog\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/\" title=\"WordPress\">WordPress<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPage Cache Is Not Detected: What WordPress Site Health Actually Checks\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.ahosting.net\/blog\/"},{"label":"WordPress","link":"https:\/\/www.ahosting.net\/blog\/category\/wordpress\/"},{"label":"Page Cache Is Not Detected: What WordPress Site Health Actually Checks","link":"https:\/\/www.ahosting.net\/blog\/page-cache-is-not-detected\/"}],"_links":{"self":[{"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/posts\/1319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/comments?post=1319"}],"version-history":[{"count":2,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/posts\/1319\/revisions"}],"predecessor-version":[{"id":1324,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/posts\/1319\/revisions\/1324"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/media\/1320"}],"wp:attachment":[{"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/media?parent=1319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/categories?post=1319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ahosting.net\/blog\/wp-json\/wp\/v2\/tags?post=1319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}