noindex, nofollow: When to Use It and When You Shouldn't
Most developers reach for noindex, nofollow when they want a page to "disappear" from Google. The problem is that the two directives do completely different things, the nofollow half of the pair is almost never what you actually want, and treating them as a single combined toggle has caused more silent ranking damage than any other meta robots mistake. This guide is about understanding each directive on its own, the legitimate cases where the combined value is correct, and the more common cases where it is the wrong choice.
What noindex and nofollow Actually Do
noindex tells search engines not to include the page in their index. After Googlebot crawls the page and parses the HTML, it discards the page from indexing eligibility. The page can still be crawled, links on the page are still discovered, and link equity flowing into the page can still pass through to onward links — but the page itself will not appear in search results.
nofollow at the page level (i.e. inside the <meta name="robots"> tag, not on a single anchor) tells Google not to pass link equity from any of the links on this page. Every internal link, every external link, every navigation link in the header and footer — all of them are treated as if they had rel="nofollow" on them. Google may still follow them for crawl discovery, but no PageRank flows through.
The combined directive noindex, nofollow means: do not index this page, and do not pass any link equity from this page to any of the URLs it links to. That second half is the part most people do not actually intend.
Here is the canonical implementation:
<!-- HTML head --> <meta name="robots" content="noindex, nofollow"> <!-- Equivalent HTTP header (preferred for non-HTML resources) --> X-Robots-Tag: noindex, nofollow <!-- Index but don't pass link equity --> <meta name="robots" content="index, nofollow"> <!-- noindex but DO pass link equity (what you usually want) --> <meta name="robots" content="noindex, follow">
Legitimate Use Cases for noindex, nofollow
The combined directive is correct in a narrow set of scenarios — pages where you genuinely do not want Google indexing the page and you genuinely do not want any of the outbound links on the page to receive credit from this URL.
Login pages and authenticated dashboards. A user-area shell page (/login, /account, /dashboard) has nothing useful for Google to index, and the links on it (settings, billing, internal admin tools) should not be in Google's map of your public site. noindex, nofollow is a defensible default here.
Internal admin and staff tools. If a CMS admin URL or an internal-only reporting page somehow ends up publicly accessible, noindex, nofollow prevents it from being indexed and prevents any links inside it from leaking the existence of internal endpoints to Google. Better, of course, is to put these behind HTTP authentication so Googlebot cannot reach them at all.
Order confirmation and thank-you pages. A post-purchase page like /order/confirmation/?id=12345 is uniquely generated, contains personal data, and has no search demand. The links on it (back to shop, view order history) are universally available from indexed pages, so withholding link equity costs nothing. noindex, nofollow is correct.
Test, staging, and preview environments. Any non-production environment should return noindex, nofollow on every URL, ideally combined with HTTP basic auth. Even if a staging URL leaks into a tweet or a Slack message, the directive prevents Google from indexing it and prevents the staging copy of your link graph from polluting your production site's perceived structure.
Search results pages (/search?q=...). Internal site search result pages typically should not be indexed (Google has explicitly called these "low-quality search results within search results"), and the links on them are duplicated from your indexable category and product pages. noindex, nofollow here avoids the worry of Google crawling tens of thousands of synthetic search URLs.
What People Get Wrong
The most damaging pattern I see is using noindex, nofollow as a blanket "hide this from Google" directive on pages that should pass link equity normally. The classic offenders:
Tag pages, archive pages, and thin category pages. A blog tag page (/tag/javascript/) might have low search value of its own, so you reach for noindex. Fine — but adding nofollow means none of the article links on that tag page pass equity. If your tag pages are linked from your sidebar across the site, you have just told Google that links flowing into your articles via tag pages should be discarded. The right value is noindex, follow.
Paginated archives (page 2, page 3, etc.). Same pattern: you may not want page 2 of a category indexed, but page 2 contains links to ten product or article pages that absolutely should receive equity. noindex, nofollow kills that flow. Use noindex, follow, or better, leave pagination indexable and let Google consolidate naturally.
Faceted navigation views. A filtered category view (?color=blue&size=large) often deserves noindex to avoid duplicate-content concerns. But every product card on that filtered view links to a real product detail page, and you want link equity flowing through. noindex, follow is correct.
Pages temporarily under construction. Marking a content page noindex, nofollow while you rewrite it tells Google to drop both the page and the outbound link signal until you change it. If the page is internally linked, this leaks equity that should be flowing through to your other pages. Use noindex, follow, or use a 503 response if the page is genuinely down.
noindex, follow vs noindex, nofollow
This is the single most important distinction in the meta robots tag. The difference between noindex, follow and noindex, nofollow is whether the outbound links on the page contribute to your site's internal link graph or not.
With noindex, follow, the page itself is not indexed, but every link on the page acts as a normal link. PageRank flows through, anchor text counts, and the linked URLs benefit from being linked. This is the right choice for the vast majority of pages you want hidden from search results.
With noindex, nofollow, the page is not indexed and none of the links carry any signal. From a link-graph perspective, the page becomes a dead end for ranking purposes.
Note one important wrinkle: Google has stated that long-term noindex, follow is eventually treated similarly to noindex, nofollow because pages that stay noindexed for an extended period get crawled less frequently, and links on rarely-crawled pages naturally pass less signal. But this is a slow drift over many months, not an immediate switch — and it does not change the fact that noindex, follow is the right initial choice for a page you want temporarily or selectively hidden.
Page-Level nofollow vs Link-Level rel="nofollow"
Page-level nofollow (inside <meta name="robots">) and link-level rel="nofollow" (on a single <a> tag) sound related but solve different problems.
Page-level nofollow applies to every link on the page indiscriminately. It is a blunt instrument and is rarely the right answer because it kills internal navigation signals along with whatever you were actually trying to suppress.
Link-level rel="nofollow" (and the more specific rel="ugc" for user-generated content and rel="sponsored" for paid links) targets a single link. Use it when you have one specific outbound link you do not want to vouch for — a comment from an unknown user, an ad, an affiliate link — without affecting the rest of the page's links.
<!-- Don't pass equity to this single link --> <a href="https://untrusted.example.com" rel="nofollow">link</a> <!-- User-generated content (forum post, comment) --> <a href="https://example.com" rel="ugc">submitted by user</a> <!-- Sponsored / paid placement --> <a href="https://advertiser.example.com" rel="sponsored">sponsored</a> <!-- Combine when applicable --> <a href="https://example.com" rel="ugc nofollow">link</a>
The rule of thumb: link-level attributes are almost always preferable to page-level nofollow. If you can identify the specific links you want to discount, mark them individually and leave the rest of the page's link graph intact.
Why Page-Level nofollow Is Rarely the Right Answer
If you find yourself adding nofollow to the meta robots tag of a content page, stop and ask what you are actually trying to achieve.
If the goal is "hide this page from Google," noindex alone (or noindex, follow) is sufficient. The nofollow half adds nothing to deindexing and only suppresses the link graph signal you almost certainly want preserved.
If the goal is "don't pass equity to one specific external site," use rel="nofollow" on the individual link, not the entire page.
If the goal is "prevent Google from crawling links on this page," the right tool is robots.txt disallow on the destination URLs, not page-level nofollow — Google explicitly notes that nofollow is a hint about ranking signals, not a strict crawl directive.
If the goal is "this is a test page that links to broken URLs," the right answer is to fix the broken URLs or to take the page offline entirely with a 410, not to mask the issue with a meta tag.
Implementation Across Stacks
The HTML <meta> tag works for any HTML page, but in many cases an HTTP header or framework-level directive is cleaner.
Apache (.htaccess):
# Apply noindex, nofollow to all PDF files <FilesMatch "\.pdf$"> Header set X-Robots-Tag "noindex, nofollow" </FilesMatch> # Apply to a specific path (e.g. /staging/) <LocationMatch "^/staging/"> Header set X-Robots-Tag "noindex, nofollow" </LocationMatch>
nginx:
# Apply noindex, nofollow to staging subdomain
server {
server_name staging.example.com;
add_header X-Robots-Tag "noindex, nofollow" always;
}
# Apply to specific paths
location /admin/ {
add_header X-Robots-Tag "noindex, nofollow" always;
}
# Apply to file types
location ~* \.(pdf|docx)$ {
add_header X-Robots-Tag "noindex, nofollow" always;
}Next.js (App Router):
// app/login/page.tsx
import type { Metadata } from 'next';
export const metadata: Metadata = {
robots: {
index: false,
follow: false,
nocache: true,
googleBot: {
index: false,
follow: false,
},
},
};
// noindex, follow (the more common correct choice)
export const metadata: Metadata = {
robots: {
index: false,
follow: true,
},
};Alternatives to noindex, nofollow
Before reaching for the meta tag, consider whether one of these alternatives is a better fit:
HTTP basic authentication. If a page genuinely should not be reachable by anyone outside your team, put it behind HTTP auth. Googlebot cannot crawl authenticated content at all, which is stronger than any meta directive. This is the right answer for staging environments and internal admin tools.
X-Robots-Tag in HTTP headers. For non-HTML resources (PDFs, images, JSON files), there is no <head> to put a meta tag in. The X-Robots-Tag response header is the only way to apply noindex or nofollow to those resources. See the X-Robots-Tag guide for full coverage.
robots.txt disallow. If you want to prevent Google from crawling a path entirely, Disallow: in robots.txt is the strongest signal. Be careful: a disallowed URL that has external backlinks can still appear in search results as a URL-only listing without a snippet, because Google sees the inbound links but cannot fetch the page to read its noindex tag. The combined approach for a sensitive URL is to allow crawling and use noindex — only then is Google able to read and respect the deindex directive.
Canonical tag. If the issue is duplicate content rather than "hide this from Google," a rel=canonical pointing to the preferred version consolidates ranking signals without removing pages from the index. See canonical vs noindex for the choice between them.
410 Gone or 404 Not Found. If a page truly should not exist, return a 410. This deindexes faster than a noindex meta tag and removes ambiguity about intent.
Recovery Time After Lifting noindex, nofollow
If you discover that noindex, nofollow was applied incorrectly to pages that should be indexed and passing equity, the recovery timeline depends on how Google's crawl scheduler treats those URLs.
Reindexing the page itself. Once you remove the noindex directive and Googlebot recrawls the page, eligibility for indexing is restored. For high-importance pages on a frequently-crawled site, that is often within a few days. For low-priority URLs, it can take 2–6 weeks. You can speed up the process for critical pages by using GSC's URL Inspection tool and clicking "Request Indexing" — this typically pushes a recrawl within 24–48 hours.
Restoring link equity flow. When you remove the nofollow half, links on the page resume passing equity once Google recrawls the page and parses the new directive. The recovery of downstream rankings is slower than the recrawl itself because PageRank is recomputed over many crawl cycles — expect 4–12 weeks for the full link-graph effect to settle.
Pages that were noindexed for a long time. If a page was noindexed for many months, Google's crawl frequency on it has declined and Googlebot may not return to it quickly. Submit it via URL Inspection, ensure it is in your sitemap, and check that internal links to it are healthy. Repeated "Request Indexing" submissions every few days for high-priority URLs are not abusive — they are the documented mechanism for prioritizing recrawl.
One reliable signal that the lift is working: the GSC "Crawled - currently not indexed" or "Excluded by ‘noindex’ tag" status moves to "Submitted and indexed" for the affected URLs within the recrawl window.
How to Audit Your Site for Misuse
The first step in fixing accidental noindex, nofollow deployments is finding them. A simple crawler pass against your sitemap can surface every page outputting either directive — what matters is reviewing the list against intent.
Pull the list of all URLs returning noindex, nofollow and ask, for each: do I want this page hidden from search results and do I want all its outbound links to receive zero equity from this URL? If the answer to the second question is no, switch to noindex, follow. If both answers are no, remove the directive entirely.
SitemapFixer's scanner flags every URL outputting noindex and breaks them down by directive combination, so you can review the "noindex, nofollow" bucket separately and decide intentionally which pages should keep both halves and which should switch to the more typical noindex, follow.