You have /blog/, /blog/page/2/, /blog/page/3/. Search Console flags “Duplicate, Google chose different canonical” on page 2+. Old SEO blogs say rel="prev" and rel="next", or canonical all paginated pages to /blog/. Newer blogs say the opposite. Both are partially out of date. Google officially deprecated rel=next/prev in 2019 but it took years for the message to propagate. Current best practice for content sites: each paginated page is self-canonical, treated as an independent listing. For paginated low-value views (search results pagination, faceted filters), use noindex, follow instead.
This guide explains the rationale and the per-platform implementation.
Common causes
Ordered by hit rate, highest first.
1. Old tutorials say page/2 → page/1 canonical
Pre-2019 SEO advice was to canonical all paginated pages to page 1. Modern Google interprets that as you saying “these aren’t real pages — show me page 1 instead.” Page 2-N content effectively becomes invisible in search.
How to spot it: Look at /blog/page/2/’s <link rel="canonical">. If it points to /blog/, you’ve followed the old advice.
2. Still emitting rel=next/prev
Some templates still emit these. They’re harmless but useless — Google ignores them. Cleaner to remove.
How to spot it: curl -s yoursite.com/blog/page/2/ | grep -E 'rel="next"|rel="prev"'. Present = remove (optional, doesn’t hurt).
3. Paginated pages have noindex AND self-canonical conflict
Some templates noindex pagination and leave it in sitemap, creating the same conflict described in Robots meta vs sitemap conflict.
How to spot it: View source of paginated page. If both noindex AND it’s in sitemap.xml, fix the conflict.
4. Pagination uses URL parameters Google can’t tell apart
/blog?page=2&sort=date&filter=ai — Google’s heuristics may treat permutations as duplicates without canonical guidance. Worse, search engines may crawl all permutations and find low-value pages.
How to spot it: Pagination uses query string parameters (especially multiple) instead of path segments.
5. Paginated content actually IS duplicate (filter views)
You have /blog/?tag=ai, /blog/?tag=ai&page=2, etc. Each combination produces a unique URL but the page itself is just filtering an existing list. These should be noindex, follow.
How to spot it: If a paginated URL exists only because of a filter combination (not an inherent pagination over your library), it’s a filter view, not real pagination.
6. Infinite scroll pages without proper URL state
Infinite-scroll listings load more items via JS but never update the URL. Google can’t crawl deeper pages. (Different issue, but related.)
How to spot it: Scrolling adds items but URL stays at /blog/. Google sees only the initial 10 items.
Shortest path to fix
Step 1: Decide per pagination type
| Pagination type | Treatment |
|---|---|
Main blog index pagination (/blog/page/2/) | Each page self-canonical, indexable |
| Category / tag pagination | Self-canonical, indexable |
| Search results | noindex, follow |
| Faceted filter combinations | noindex, follow or block in robots.txt |
| Infinite scroll | Use paginated SSG URLs in parallel |
Step 2: Make blog / category pagination self-canonical
For Astro:
---
const url = new URL(Astro.url.pathname, Astro.site).toString();
---
<link rel="canonical" href={url} />
/blog/page/2/ canonical → /blog/page/2/. Done.
Step 3: Stop emitting rel=next/prev
Remove the tags from your layout. They don’t hurt but they’re noise.
- <link rel="next" href={`/blog/page/${currentPage + 1}/`} />
- <link rel="prev" href={`/blog/page/${currentPage - 1}/`} />
Step 4: Noindex low-value pagination
For search results or filter combinations:
<meta name="robots" content="noindex, follow">
follow is important — Google still follows internal links to find indexable content.
Step 5: Make sure paginated pages are crawlable
Pagination links must be real <a href>, not JavaScript-only buttons. Google’s render budget may not execute JS pagination.
<a href="/blog/page/2/" rel="next">Next</a>
Step 6: Submit a sitemap with paginated URLs
Include /blog/, /blog/page/2/, /blog/page/3/… as individual entries. Helps Google discover deep pagination.
For very deep pagination (>30 pages), consider creating browseable category/tag listings as well so deep articles have shorter paths to discovery.
Step 7: Audit Search Console after fix
Search Console → Pages → look at status of paginated URLs. Should move from “Duplicate, Google chose different canonical” to “Indexed” over 2-4 weeks.
Prevention
- Treat each paginated page as an independent listing — self-canonical, indexable.
- Don’t emit
rel=next/prev— Google deprecated them. - For filter/search-result pagination,
noindex, follow(don’t fully block — Google still needs to discover content). - Real
<a>links for pagination, not JS-only. - Audit pagination behavior any time you add a new listing type to the site.
Related
- Canonical misconfigured
- Canonical mismatch bilingual
- Last-Modified header missing
- Duplicate without user-selected canonical
Tags: #SEO #Troubleshooting