Pagination Canonical Configuration Confusion

Should `page/2` canonical to `page/1` or to itself? Google's actual current guidance.

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 typeTreatment
Main blog index pagination (/blog/page/2/)Each page self-canonical, indexable
Category / tag paginationSelf-canonical, indexable
Search resultsnoindex, follow
Faceted filter combinationsnoindex, follow or block in robots.txt
Infinite scrollUse 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.

Tags: #SEO #Troubleshooting