HandyBench

Canonical Tag Checker

Verify a page's canonical tag and catch duplicate-content mistakes.

This check runs through this site's own server, so it works for any public URL — no CORS or browser restrictions.

How to use the Canonical Tag Checker

  1. 1 Enter the page URL and click Check canonical.
  2. 2 See whether a canonical is declared (in the HTML tag or the HTTP Link header), whether there is more than one, and whether it is an absolute URL.
  3. 3 Compare the canonical against the final URL to see if it is self-referencing or points elsewhere.

What this checker compares

The checker fetches your page through the site's server, follows any redirects, and reads the final URL that was reached, every <link rel="canonical"> tag in the HTML (the rel value is read as a token list, so rel="canonical nofollow" counts) and any canonical in an HTTP Link header. It then reports one of four main verdicts, plus warnings when there are duplicate or conflicting declarations. The canonical tag is defined in RFC 6596, and Google treats it as a strong hint, not a command.

VerdictMeaning
No canonical tag declared (red)No rel="canonical" link with an href was found in the HTML
Canonical URL is relative (amber)The value does not start with http:// or https://
Self-referencing (green)The canonical equals the final URL after normalization
Points to a different URL (amber)Absolute, but not equal to the final URL
Conflicting canonical declarations (red)Two or more canonicals, or an HTML tag and a Link header, pointing at different URLs
Multiple canonical tags (amber)More than one tag, all pointing at the same URL
Canonical only in the HTTP Link header (amber)No HTML tag, but the response header names a canonical

When a page declares more than one canonical tag, every tag is listed, but the relative, self-referencing and different-URL checks use the last one in the document, the same tag the site's page-meta API reports. Browsers and search engines are not consistent here, and Google says conflicting canonicals may be ignored altogether, so treat any page with several tags as a bug to fix rather than relying on which one wins.

How "same URL" is decided

Before comparing, both URLs are normalized: the host is lowercased and one trailing slash is dropped from any path longer than /. The scheme, path case and query string are kept exactly as written, so differences there count as a mismatch. I ran these pairs through the same normalization:

CanonicalFinal URLResult
https://Example.com/blog/https://example.com/blogSame
http://example.com/bloghttps://example.com/blogDifferent (scheme)
https://example.com/blog?utm=1https://example.com/blogDifferent (query)
https://example.com/Bloghttps://example.com/blogDifferent (path case)

The second row is the classic migration bug: an HTTPS page whose canonical still says HTTP, which asks search engines to prefer the insecure version.

Limits and common mistakes

  • The HTTP header is read too. A canonical sent as Link: <https://example.com/page>; rel="canonical" (used for PDFs and other non-HTML files) is picked up and compared with the HTML tag. The HTTP headers checker shows the raw header.
  • The first megabyte of HTML. A canonical tag placed after about 1 MB of markup is missed. Canonicals belong in <head>, near the top, anyway.
  • Two canonical tags are flagged, not silently resolved. Every tag found is listed. If they differ the verdict is a red conflict, since search engines may ignore conflicting tags entirely; if they match it is an amber warning. Duplicates (often added by both a theme and an SEO plugin) are worth removing.
  • Tags added by JavaScript are not seen. Only the HTML the server returns is parsed, which can differ from what Google sees after rendering.
  • The checked URL matters. If you enter a parameter URL and the canonical points to the clean version, that is the setup working as intended, even though the verdict is amber.

To see everything else a page declares in its head, such as the robots meta tag and Open Graph data, use the meta tag checker, and read the meta tag audit guide for the order to check things in.

Examples

  • ▸ A page at https://example.com/blog/ with canonical https://example.com/blog gets the green "self-referencing" verdict, because the trailing slash is ignored in the comparison.
  • ▸ An https page whose canonical still reads http://example.com/blog is flagged as pointing to a different URL, a common leftover from an HTTPS migration.
  • ▸ A canonical written as /blog (no scheme or host) is flagged as relative and should be rewritten as a full https:// URL.

Frequently asked questions

What is a canonical tag for?

A <link rel="canonical"> tag tells search engines which URL is the "master" version when the same or similar content is reachable at more than one URL (e.g. with tracking parameters, http vs https, or a print view), consolidating ranking signals onto one page.

What does "self-referencing canonical" mean?

It means the page points its canonical tag at its own URL. This is the most common and safest setup — it explicitly confirms this exact URL is the preferred version of itself.

Is it a problem if my canonical points to a different URL?

Not necessarily — pointing a duplicate or parameterized URL at the "real" page is intentional and useful. It is only a problem if an important, unique page accidentally canonicalizes to a different URL, which tells search engines to effectively ignore it.

Should the canonical URL be absolute or can it be relative?

Use an absolute URL (with https:// and the full host). Google explicitly recommends absolute canonicals, since a relative one can be resolved incorrectly depending on the page's <base> tag or how it was crawled.

Does this tool read a canonical set in an HTTP Link header?

Yes. It reads both the <link rel="canonical"> tag in the HTML and a Link: <url>; rel="canonical" response header (used for PDFs and other non-HTML files). If both exist and point at different URLs it reports a conflict. The HTTP headers checker shows the raw header.

What happens if a page has two canonical tags?

The tool lists every canonical it finds. If they point at different URLs it shows a red conflict verdict, because search engines may ignore all of them; if they are identical it shows a warning, since the duplicate usually comes from a theme and an SEO plugin both adding one. Either way, keep a single tag.

Why does a trailing slash not count as a difference?

Before comparing, the tool lowercases the host and drops a single trailing slash. The scheme, path case and query string are still compared exactly, so http versus https, /Blog versus /blog, or an added ?utm parameter all count as a different URL.

Related guides