Canonical Checker
See which canonical URL a live page actually serves, and whether the rest of its head agrees.
What this tool does
Canonical Checker asks the OmniKitly processing service to request a page and reads the rel="canonical" link out of the HTML that comes back. A canonical is how a site nominates one address as the keeper when the same content sits at several — with and without a trailing slash, with a tracking parameter, under a second category path — so the value that decides a duplicate content question is not the one the template was written to emit, but the one the server served at the address you asked for.
Every canonical link in the head is counted, not only the first, and each one is printed twice: the value as written and the value it resolves to, next to the address the fetch landed on, the og:url and the robots directive from that same response. Findings sit underneath — two canonicals disagreeing, an empty href, a canonical on http, one carrying utm_ or gclid parameters, a #fragment, a noindex sitting beside a canonical, an og:url naming somewhere else — because a consolidation problem is usually a disagreement between those signals rather than one absent tag. Hreflang alternates are counted too, with a note when x-default is missing.
What the reading cannot reach matters as much. Only the source down to the closing </head> comes back from the fetch, so a canonical injected by JavaScript or a tag manager has not run yet, and one written after </head> by a plugin falls outside the slice; a canonical carried in an HTTP Link header is not covered, because response headers are not part of this fetch; and the canonical target is never requested, so whether it answers 200, redirects onward or declares a different canonical of its own is left untested. The head is read with a regular-expression parser rather than a browser DOM, which means attribute order is irrelevant — a link written href first is read like any other — but also that a tag sitting inside a script string or a template is counted as though it were live.
The fetch happens on the service and not in this tab, because a browser cannot read another domain's HTML across origins. It goes out as OmniKitly/1.0 with no cookies and no sign-in, so a site that varies its head by user agent, or refuses agents it does not recognise, can answer this check differently from the browser you are reading it in, and a page behind a login returns whatever an anonymous visitor gets. The address you enter travels there over an encrypted connection and is stored with the job record, which is deleted along with the report when the job expires — six hours after it ran, unless an administrator has changed the retention setting.
How to use it
- Enter the page address. A full https:// URL for the exact page in question, path and query included. Only http and https are accepted, and the service issues the request itself, so the page has to be reachable from the public internet.
- Run the check. Each redirect is followed one hop at a time and re-checked against the blocked ranges, up to five hops, and the first 512 KB of the response is read. Any single request that has gone fifteen seconds without an answer is abandoned.
- Read the canonical beside the address that was fetched. Both appear in the table, declared and resolved, and the check states whether they match. A difference of only a trailing slash or a capital letter is called out by name, since that is the classic way a page ends up canonicalised to a URL that redirects back to it.
- Use “URL of this page” to change what it is compared with. Left empty, the canonical is measured against the final URL the fetch landed on. Type an address into that setting and the comparison — and the resolving of any relative canonical — is done against yours instead, which is how you test whether a variant folds into the page you expect.
- Keep the evidence. The report renders in the output pane, and the raw fetch downloads as meta.json with the head source, HTTP status, page title, description and Twitter values that the on-screen table leaves out. Diffing two of those after a template change is straightforward.
Processing & privacy
Secure server processing. This operation requires temporary server processing.
Common use cases
A URL variant that keeps getting indexed
Parameter, paginated and tagged copies are indexed separately when the canonical is missing or when each variant points at itself. Reading the live address settles which of the two is happening.
After a migration or a change of slug
Templates often go on emitting the previous address. Fetching the new URL shows whether the canonical moved with the page or is still folding it into a URL that now redirects.
One page type a CMS plugin skipped
Canonical tags written by a theme or an SEO plugin can be complete on posts and absent on archives. This reads the specific address rather than the rule meant to have produced it.
Settling a duplicate content argument
Two people looking at the same page in different tools disagree less when the canonical, the final URL, the robots meta and og:url are printed together from a single request.
Questions
Where does the URL I enter go?
It reports no canonical, but I can see the tag in my source
What happens when a page declares two canonicals?
Does it confirm the canonical URL actually works?
What about a canonical sent in an HTTP header?
Should the canonical be absolute or relative?
Can I paste the page's HTML instead of a URL?
Can I check a staging site?
Related tools
- Meta Tag Preview — See how your title and description look in search results.
- Redirect Checker — Follow a redirect chain and see every hop.
- WCAG Contrast Checker — Test colour pairs against AA and AAA thresholds.
- Favicon Generator — Generate a full favicon set from one source image.
- Open Graph Preview — Preview how a link unfurls on social platforms.
- Social Card Preview — Check Twitter, LinkedIn and Slack card rendering.