A canonical tag is the cheapest way to lie to yourself about duplicates. It is one line in the head, every framework emits one by default, and the check most scanners run is "does it exist". The interesting failures are all in the address it contains, which is the part a presence check never reads.
This article is about what a canonical is allowed to claim, the mistakes that split signals instead of consolidating them, and how to audit the address rather than the tag.
What a canonical does, and does not do
rel="canonical" is a hint that one URL is the preferred version of a piece of content. It is not a redirect: the duplicate URL still resolves and still serves. It is not a noindex, and it is not an instruction an engine must follow. It is a statement that, after redirects, this is the URL whose signals should be consolidated.
| Tool | What it does | When it is the right one |
|---|---|---|
| 301 redirect | Moves the URL permanently; the old address stops serving. | The old URL should not exist any more. |
| rel=canonical | Names the preferred URL; both addresses keep serving. | The duplicate must stay reachable (tracking links, syndication, printed URLs). |
| noindex | Asks that the page not appear in search results. | The page exists for users but not for search. |
| hreflang | Declares language and region versions of the same page. | The content is translated, not duplicated. |
Mixing them is where most of the damage happens. A canonical that points at a redirect, a canonical on a page that is also noindex, or a canonical that disagrees with the hreflang group all ask an engine to resolve contradictory instructions. The engine chooses; the site rarely likes the choice.
The mistakes that split citations
- Missing entirely. Two URLs for one page, no statement about which is preferred. Search engines pick one; an answer engine may pick the other; a link may point at a third.
- Pointing at the homepage. A canonical to
/from an article says the article is a variant of the homepage. The article's own signals are handed to the wrong page. - Pointing at a 404 or a redirect. The canonical target should be a 200 at the address it names. A canonical to a URL that redirects is a hint that resolves somewhere else, which is two instructions instead of one.
- http vs https, www vs apex, trailing slash variants. The canonical must name the final URL, not a variant that redirects to it. This site uses trailing slashes everywhere and canonicalises the slash form, so the two never disagree.
- Cross-language canonical. A Chinese page canonicalising to the English page, or an hreflang group whose members canonicalise to one language, tells an engine the translations are duplicates of each other. They are not.
- Multiple canonical tags. Two tags mean the engine has to pick; the outcome is not something the page controls. One tag per page.
- Client-side canonical. A tag injected after hydration is absent from the response a crawler parses. The same failure as client-only content, one tag up.
- Canonical plus noindex. The two instructions conflict: consolidate here, but do not show this here. Pick one.
- Paginated pages canonicalised to page one. Page 2 is not a duplicate of page 1; it is a different set of items. Canonical each page to itself unless the pagination is genuinely cosmetic.
What the scanner checks — and what it does not
The rule is canonical, worth 1 point in the citability dimension. The condition is that a rel=canonical link exists. The rule page is explicit: the address is read and not compared, nothing follows it, and a page pointing its canonical at another page or at a 404 passes.
That is the right size for a single-request check. Comparing the canonical with the fetched URL would be cheap for the scanner, but following it is a second request and judging language or pagination is a judgement. The score says "a tag is present"; the audit below is what says whether it is true.
Auditing the address, not the tag
# 1. What canonical does the server response declare?
curl -sS https://your-domain.com/page/ \
| grep -oE '<link[^>]+rel="canonical"[^>]*>'
# 2. How many canonical tags are there? One is the answer.
curl -sS https://your-domain.com/page/ | grep -c 'rel="canonical"'
# 3. Is the canonical target itself a 200 with a self-referential canonical?
CANON=$(curl -sS https://your-domain.com/page/ | grep -oE 'rel="canonical"[^>]*href="[^"]+"' | grep -oE 'https?://[^"]+')
curl -sS -o /dev/null -w "%{http_code} %{url_effective}\n" "$CANON"
curl -sS "$CANON" | grep -oE '<link[^>]+rel="canonical"[^>]*>'
# 4. Do the hreflang members agree with the canonical strategy?
curl -sS https://your-domain.com/page/ | grep -oE 'hreflang="[^"]+" href="[^"]+"'Read the four outputs together. The canonical should be absolute, should name the final URL after redirects, should return 200, and should be the same URL the hreflang group and the sitemap use. A canonical that is merely present but disagrees with the rest of the site is the failure this check cannot see.
How this site does it
Every page declares an absolute self-referential canonical built from its own path, and the localized pages declare their own language URL rather than the English one. The hreflang group lists the same URLs, the sitemap lists them, and the redirects move old aliases to the final address rather than leaving a canonical pointing at a redirect. These are not separate features; they are one statement repeated in the places an engine looks.
The point is not that the site is perfect. It is that the statement is checkable: a crawler can fetch a page and compare four things — requested URL, canonical, hreflang membership and sitemap entry — and see whether they agree.
What a canonical does not buy
It does not merge two pages into one ranking, it does not guarantee that an answer engine quotes the canonical URL rather than the duplicate, and it does not fix a page whose content is duplicated because the site genuinely has two versions. It is a hint that makes the preferred address unambiguous; the engine still decides what to do with it.
The useful standard is the one the rest of this series keeps applying: make the signal checkable, make it agree with the other signals, and do not use it to claim something the site does not deliver.