
A canonical tag is a <link> element in the page head that names which URL should get credit when the same content answers to several addresses. Duplication is the default state of the web — http/https, www/non-www, trailing slashes, tracking parameters, print views — and without canonicalization your link equity and relevance signals get split across variants, which in practice means the wrong URL ranks, or several weak versions rank worse than one strong one would.
The markup, both flavors
In HTML, one line in the <head>:
<link rel="canonical" href="https://www.example.com/product/olive-oil-1l/">For non-HTML resources (PDFs, images) or when you can't touch the markup, the same declaration works as an HTTP response header:
Link: <https://www.example.com/whitepaper>; rel="canonical"Verify what a page actually declares from the terminal:
curl -s https://www.example.com/product/olive-oil-1l/?utm_source=news
| grep -io '<link rel="canonical"[^>]*>'Rules that keep it dependable: exactly one canonical per page, absolute URL, pointing at a URL that returns 200 and is itself indexable, present in the raw HTML rather than injected by JavaScript, and self-referencing on the canonical version itself (a cheap defense against parameter variants inheriting the template).
A hint Google is free to overrule
Here's what separates people who've shipped canonicals from people who've read about them: Google treats the tag as one vote among many. Internal links, sitemap entries, redirects, and which variant has backlinks all vote too. When your tag says one thing and everything else says another, Google picks its own winner — visible in GSC URL Inspection as "Google-selected canonical" differing from "user-declared canonical." The fix is never to shout the tag louder; it's to make the other signals agree with it. The full mechanics, including cross-domain use for syndication, are in the canonical tags complete reference.
Canonical vs. 301 vs. noindex: pick the right instrument
These three get confused because all of them "deal with" pages you don't want ranking. They do different jobs:
| Situation | Right tool | Why not the others |
|---|---|---|
| Duplicate URL that users still need to load (tracking params, sort orders, print view) | Canonical tag | A 301 would break the user-facing variant; noindex throws the signals away instead of consolidating them |
| Old URL permanently replaced (migration, renamed product) | 301 redirect | Canonical leaves the dead page live and is only advisory; 301 is the strong, user-affecting signal |
| Page that must never appear in results (thank-you pages, internal search) | noindex | Canonical doesn't guarantee exclusion — Google can ignore it; a redirect would break the page |
| Syndicated copy on a partner's domain | Cross-domain canonical (or noindex on the copy) | You can't 301 someone else's live article page |
| Two genuinely different pages competing for one query | None of the three — differentiate or merge editorially | Canonicalizing non-duplicates gets ignored and muddies your signals |
The heuristic I give developers: 301 when the variant shouldn't exist, canonical when it should exist but shouldn't rank separately, noindex when it should exist but shouldn't rank at all.
How to verify canonicals on your own site
- Crawl with Screaming Frog and open the Canonicals tab: it buckets every page into self-referencing, canonicalized, missing, and — the important one — "Non-Indexable Canonical," meaning tags that point at redirecting, erroring, or noindexed targets.
- GSC URL Inspection on your templates' representative URLs: compare user-declared vs. Google-selected canonical. Any disagreement on a money page goes to the top of the backlog.
- Run key URLs through the canonical tag checker for a quick single-URL read without a full crawl.
- Curl a parameterized variant (the grep above) and confirm it declares the clean URL, not itself — templates that echo the request URL into the canonical are self-canonicalizing every variant, which defeats the whole mechanism.
- Check the chain end-to-end: canonical target should return 200 in one hop. Canonical → 301 → 200 works but wastes trust; canonical → page whose canonical points back creates a loop — see the canonical loop check.
Common mistakes
- Canonical pointing at a noindexed URL. "Consolidate my signals into a page I've excluded" is a contradiction Google resolves by guessing. Fix: point at an indexable target, always — details in canonical points to a noindex URL.
- Every paginated page canonicalized to page 1. Pages 2+ aren't duplicates of page 1 — they contain different products. This tells Google to ignore everything past the first page, orphaning deep items. Fix: self-referencing canonicals on each paginated URL.
- Template echoes the current URL into the tag. Looks fine on the clean URL, silently self-canonicalizes every parameter variant. Fix: build the canonical from the route's canonical form, not from the request.
- Protocol/host mismatch. Canonicals declaring
http://after an https migration, or the non-www host. Every tag now points through a redirect. Fix: single canonical hostname, hardcoded scheme, one-hop 200 target. - Using canonicals as a "soft redirect" between different pages to pass equity from an old article to a new one. When the pages aren't near-duplicates Google tends to ignore the tag. Fix: if the old page is done, 301 it.
FAQ
Does a canonical tag pass link equity like a 301?
When Google accepts it, consolidation includes link signals, yes — that's largely the point. The difference is certainty: a 301 is close to unconditional, a canonical is accepted only while the duplicate relationship stays believable.
Should every page have a self-referencing canonical?
Best practice, yes. It costs nothing and inoculates against parameter and case variants being treated as separate pages. Most CMS SEO plugins do this by default — verify yours actually outputs the clean URL.
Can I put a canonical tag in the <body>?
No — it's only valid in the <head>, and an early unclosed tag that breaks the head can cause Google to miss it. If markup order is fragile, the HTTP header variant sidesteps the parsing risk.
What if Google keeps selecting a different canonical than mine?
Audit the disagreeing signals: which version do internal links use, which is in the sitemap, which has external links, do the variants redirect consistently? Align all of them with your declared URL and Google usually follows within a few recrawls.
Do canonicals work across domains?
Yes, Google supports cross-domain canonicals — the standard tool for syndicated content pointing back to the original. Same caveat as everything above: it's honored when the content genuinely matches.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







