Canonical → 3xx medium
Canonical Points to a Redirecting URL
The rel=canonical names a URL that itself redirects, giving Google a conflicting signal it may ignore in favor of its own pick.
What you see
<link rel="canonical" href="https://example.com/page" /> The canonical URL returns 301 → https://example.com/final Google: "Alternate page with proper canonical tag" / canonical mismatch
What’s actually happening
Your page says canonical = URL B, but URL B 301s (or 302s) to URL C. Google sees a canonical that points at a non-200 response and treats the hint as unreliable — in Search Console you'll see "Duplicate, Google chose different canonical than user" or the page indexed under a URL you didn't intend. Link equity gets muddy and near-duplicate URLs can both linger in the index.
Common causes
- A site-wide HTTPS or www migration moved the real page to C, but the canonical tag still hard-codes the old B that now redirects.
- A trailing-slash change (page→page/) where the canonical points to the pre-slash version that 301s to the slashed one.
- A CMS generating canonicals from a stored 'permalink' field that's out of date with the current routing.
- Canonical built from a base URL constant (http:// or apex) that a server rule then redirects to the real host.
- Pagination or parameter handling pointing canonical at a 'view all' URL that itself redirects.
How to fix it
- Find the redirecting canonicalsCrawl with Screaming Frog (or a script) and report pages where the canonical target's status is 3xx, not 200. Sort by the canonical's response code. These are the ones sending Google a broken signal.
- Point canonical at the final 200 URLUpdate rel=canonical to the URL that returns 200 directly — C, not B. The canonical should always be self-referencing or point at a live page, never at a redirect hop. Fix it at the source (the CMS field or the template that builds the tag).
- Align canonical with your host/scheme rulesIf a server rule forces HTTPS+www, make the canonical emit HTTPS+www too. The tag and the redirect layer must agree on the same final URL, or every page will canonical to something that redirects.
- Recheck with URL InspectionIn Search Console, inspect an affected URL and compare 'User-declared canonical' vs 'Google-selected canonical.' After the fix they should match and point at a 200. If Google still disagrees, the canonical target may still be redirecting somewhere.
- Don't chain it againWatch out for the next migration re-breaking this. A canonical to B that redirects to C that redirects to D is worse — Google may drop the hint entirely. Keep canonicals pointing one hop to a 200, ideally zero hops.
Stop it recurring
Always point rel=canonical at a URL that returns 200 directly — never at one that 301/302s, and update it during any host or slug migration.
Related errors