Cloudflare Is Caching Your Noindex Tags
On this page
- Confirm what Googlebot actually receives
- The timing trap
- The fix workflow
- Bulk changes and the Removals tool clarification
- TTL strategy and automation
- Frequently Asked Questions
- Does purging the cache deindex the page?
- Why does the browser show my noindex while Google ignores it?
- Sources
- Related posts:
When you add a noindex tag at your origin and Google keeps treating the page as indexable, the directive is usually fine; the delivery is not. Your CDN caches the full HTML response, meta robots tag included, so after you change the directive the origin serves the new version while Cloudflare keeps handing Googlebot the cached old one until that cache expires or you purge it. If Googlebot crawls inside that window, it records the stale directive and moves on. The same trap runs in reverse when you remove a noindex and the cache keeps serving it. The fix is to purge the cache at the moment you deploy a directive change, not days later, and to make cache invalidation a standing step in every SEO-directive deployment.
Confirm what Googlebot actually receives
View-source in your browser can show you the origin’s fresh response while Google is being served the cached one, so do not trust the browser as proof. Request the URL the way a crawler would and read the cache headers:
curl -I https://example.com/page-you-noindexed/
Look at two things. First, cf-cache-status: a value of HIT means Cloudflare answered from cache, not your origin. Second, fetch the body and check whether the noindex directive is actually present in the served HTML:
curl -s https://example.com/page-you-noindexed/ | grep -i "robots"
If cf-cache-status reads HIT and the served HTML lacks your new directive (or still carries an old one you removed), you have proven the CDN, not Google, is ignoring the change.
The timing trap
The damage is done by sequence, not by the cache existing. Suppose your Edge Cache TTL is set to respect existing headers and your origin sends a long max-age, giving HTML a multi-day edge lifetime. You add a noindex at the origin. A crawl that lands shortly afterward is served the pre-noindex cached page, sees an indexable directive, and Google records the page as indexable. Your correct directive is sitting at the origin, invisible behind the cache, and Google has already made its decision based on the stale copy.
Low-priority pages make this worse. The pages you most often want to noindex (thin variants, old campaign URLs, parameter pages) are exactly the ones Google recrawls infrequently. So even after the cache eventually refreshes, the corrected directive may sit unseen for weeks until the next crawl, during which the stale decision stands. The two delays stack: first the cache has to expire or be purged before the origin’s directive is served at all, and then Google has to come back and crawl the page to read it. For a low-priority URL, the second delay can dwarf the first, which is why catching the cache early is the only part of the timeline you actually control.
The reverse case is just as common and easier to miss. You remove a noindex to bring a page back into the index, the origin now serves an indexable response, but the cache keeps handing Googlebot the old noindexed HTML. The page stays out of the index and you blame the directive change, when the change worked and the cache is the holdout. Same mechanism, opposite direction, same fix.
The fix workflow
Order the deploy so the cache can never serve a stale directive into a crawl:
- Add or remove the directive at the origin.
- Verify it locally by hitting the origin directly (or with cache bypassed) and confirming the served HTML carries the intended directive.
- Purge the cache immediately, ideally as part of the same deploy step, so the very next request (including a crawler’s) hits a fresh response.
Purging days later is the failure mode: a crawl during the gap may already have locked in the wrong decision, and a late purge only fixes what Google sees on its next visit, which for a low-priority page could be far in the future. Purge at deploy, not after you notice the problem.
Bulk changes and the Removals tool clarification
For a large directive change across many URLs, nudge recrawl by updating the sitemap’s lastmod to the current date for the affected URLs, which signals freshness and can pull crawlers back sooner. Pair that with the cache purge so the recrawl meets the corrected response.
If a specific page is urgently surfacing in results and must disappear fast, the GSC Removals tool can hide it, but understand what it does. It temporarily hides a URL from results for roughly six months; it does not deindex the page and does not stop crawling. Use it as a stopgap for an urgent case while the real directive and cache purge take effect, never as the fix itself. When the six months lapse, a page without a respected noindex or a 404/410 will return.
TTL strategy and automation
The structural fix is tiered caching. Static assets (images, fonts, compiled CSS and JS with hashed filenames) can carry long TTLs because they change by filename. HTML that may need a directive change should carry a short TTL, on the order of four to eight hours, so a stale directive cannot survive long even if a purge is missed. Separating these means you keep the performance benefit of aggressive asset caching without letting your robots directives sit cached for days.
Then automate the purge. Wire a cache invalidation into your deploy pipeline through a CMS hook or the Cloudflare API so that any change touching HTML triggers a purge of the affected URLs without anyone remembering to do it manually. The manual purge is the step that gets skipped under pressure, and the skip is what produces the stale-directive crawl.
One clarification worth keeping straight: noindex controls whether a page appears in the index, not whether link equity flows through it. A noindexed page can still pass equity through its links, so noindexing a page to manage its search visibility does not sever it from the rest of your link graph.
The same caching discipline extends to canonical tags and redirects, because the failure object is the same: a directive that lives in the HTML response and therefore gets cached with it. If you change a canonical at the origin and the CDN serves the old one, Google consolidates to the wrong URL until the cache clears. If you add a redirect rule but the cached 200 response is still served, the redirect never reaches the crawler. Treat any change to a robots, canonical, or redirect directive as a cache event, and purge as part of the deploy, rather than learning weeks later that Google has been reading a cached copy of a directive you already changed.
Frequently Asked Questions
Does purging the cache deindex the page?
No. Purging only ensures Google receives your fresh response, directive included, on its next crawl. Deindexing then happens when Google recrawls, reads the noindex, and processes it. The purge removes the obstacle; it is not the removal itself.
Why does the browser show my noindex while Google ignores it?
Your browser may be served the origin response or a different cache state than Googlebot. Verify with curl -I and check cf-cache-status; a HIT with the old directive in the served HTML confirms the CDN is serving a stale cached version to crawlers.
Sources
Cloudflare Docs, Cache control and purging: https://developers.cloudflare.com/cache/how-to/purge-cache/
Google Search Console Help, Removals and SafeSearch reports tool: https://support.google.com/webmasters/answer/9689846
Google Search Central, Block search indexing with noindex: https://developers.google.com/search/docs/crawling-indexing/block-indexing