Noindex and Nofollow on the Same Page
noindex and nofollow are independent directives that get typed together out of habit. noindex removes a URL from results. Page-level nofollow tells a crawler not to follow the links on that page. Putting both on a URL is occasionally correct and usually not, because the second directive severs a crawl path you probably wanted to keep.
The distinction that matters most: page-level nofollow in a robots directive is not the same thing as rel="nofollow" on an individual link. They share a word and do different jobs.
The four combinations
Neither. The default. Indexable, links followed. Nothing to configure.
noindex alone. The URL will not appear in results, and the links on it are still followed. This is the right setting for most pages you want hidden from search but which still form part of your site’s structure — a filtered listing, an internal utility page, a thank-you page that links back into the catalogue.
nofollow alone. The URL is indexable but its outbound links are not followed. This is rare and almost always a mistake when found in the wild. A page worth indexing is a page whose links are worth following.
Both, or none. The URL is out of results and is a dead end for crawling. Correct only when the page genuinely leads nowhere you care about.
What page-level nofollow actually severs
A crawler discovers URLs by following links. Every page that is fetched contributes its links to the discovery queue. A page marked nofollow contributes none.
If that page is the only path to a section of your site, that section becomes unreachable by crawl — an orphan cluster. It may still be discovered from a sitemap or an external link, but the internal path is gone. The general mechanics of that are in internal linking as plumbing; the point here is that a page-level nofollow produces the effect deliberately, and often without anyone intending it.
The realistic scenario: someone noindex, nofollows a paginated archive because they do not want page 3 of a tag listing in search results. The listing was the primary internal path to older posts. Those posts are now discoverable only from the sitemap.
The fix is to drop nofollow and keep noindex. The archive stays out of results and continues to work as a crawl path. That is precisely what the combination noindex alone is for, and it is why the pairing is the wrong default. Pagination has more of this shape to it — see pagination without rel=next and rel=prev.
The rel attribute is a different thing
rel="nofollow" on an anchor is a per-link annotation. Its documented purpose is to say that you do not want to endorse or pass signals through that specific link. Related values rel="ugc" and rel="sponsored" describe the nature of the link more precisely.
Two properties worth being clear about:
- It is per-link, not per-page. Ten links on a page, one annotated, nine not.
- As of this writing it is treated as a hint for the purposes of crawling and indexing rather than an absolute instruction, which means an annotated URL may still be crawled. The annotation describes your relationship to the link; it is not a robots directive.
The place this causes confusion is in debugging. “The page has nofollow” is ambiguous between a robots directive on the page and an attribute on the link that points at it, and the two have different consequences and different fixes. When reading someone else’s report, establish which is meant before acting.
Where noindex plus nofollow is actually right
A page that exists only to be a form target. A POST-only endpoint that renders a confirmation with no navigation. Nothing to index, nothing to follow.
Internal search results. Out of results, and the links are to pages already reachable through navigation. Though the better answer here is usually to keep them out of the crawl entirely — a Disallow on the search path — because search URLs are an unbounded surface generated from whatever anyone types.
An expired listing kept alive for direct traffic. The page should not surface, and its links point at other expired listings.
In each case the test is the same: name the URLs you are refusing to discover through this page, and confirm you can reach them another way. If you cannot name them, do not set nofollow.
A noindexed page is not a deleted page
Worth stating because the two get confused when someone is trying to make a URL go away.
A noindexed URL still returns 200. It still exists. It can still be linked to, still be visited, still be crawled — indeed it must remain crawlable for the directive to be read at all. What it does not do is appear in search results.
That makes noindex the wrong tool for a URL that is gone (use 404 or 410) and the wrong tool for a URL that moved (use a 301). The decision path across all three is in canonical, redirect, or noindex, and the end-of-life cases specifically are in retiring a page that still has inbound links.
There is also a long-observed side effect: a URL that stays noindexed for a long time tends to be crawled less often, and there is some reported behaviour of long-term noindexed URLs eventually being treated as though their links were not followed either. That is observed rather than documented, so treat it as inference — but it argues against using noindex as a permanent parking state for pages you actually want crawled.
Combining with a canonical
A page with both noindex and a canonical pointing elsewhere sends contradictory instructions. The canonical says “consolidate this URL’s signals into that one,” which presumes both are indexable candidates. The noindex says “this one is not a candidate.”
Documented advice is to avoid the combination, because the resolution is undefined — the engine may honour the canonical and index the target, may honour the noindex, or may apply the noindex to the canonical target on the reasoning that the two URLs are the same page. That last outcome is the dangerous one: you can deindex a page you wanted by noindexing something that canonicals to it.
Pick one. If the URL is a duplicate, canonical it and leave it indexable. If it should not be in results on its own merits, noindex it and remove the canonical.
Auditing what you have
# every robots directive across a crawl export, counted
grep -ho 'content="[^"]*"' rendered/*.html \
| sort | uniq -c | sort -rn
What you are looking for in the output:
index, follow— noise, remove it from the template.noindex, nofollowin bulk — almost certainly a template-level default that nobody chose deliberately. Check what depends on those pages as a crawl path.nofollowwithoutnoindex— inspect individually; this combination is rarely intended.- Any directive on a page you would expect to rank — the most valuable finding, and the one worth checking on production rather than in a crawl export, since the header version does not appear in the HTML at all. Both places to look are covered in X-Robots-Tag and files with no head element.