What the checker fetches and compares
Enter one URL. The checker requests it, follows up to four redirects (each request gets 9 seconds), and reads up to about 900 KB of the HTML that comes back. Everything it reports is about the final page in that chain, not the address you typed.
From that HTML it collects every link element whose rel attribute includes canonical, turns a relative href into an absolute URL against the final address, and drops any #fragment. It also collects robots meta tags: the one named robots, and any whose name ends in bot, such as googlebot or bingbot. From the response headers it reads a canonical sent in a Link header, which is how PDFs and other files declare one, and X-Robots-Tag. Then it compares the canonical with the final URL, character for character.
When the canonical names a different URL, the checker requests that URL too, status only, and reports where it ends up. A canonical pointing at a page that redirects or no longer exists is a hint Google cannot follow.
What it does not do
- It reads the HTML your server sends. A canonical added later by JavaScript is not seen.
- It checks the canonical target’s status, not its content. Whether the target names itself as canonical is a second check: run the target through the checker.
- It does not read robots.txt or judge whether the page can be indexed as a whole. The Indexability Checker does.
- It finds canonical tags anywhere in the document. Google’s documentation says it only accepts one inside the head, so a tag a page builder printed in the body counts here but not for Google.
Pass, warning and fail: the exact rules
The verdict comes from a short list of rules. Fail means the page gives Google no single usable canonical, or the page itself is an error. Warning means there is one canonical, but it, or a robots tag next to it, needs a human decision.
| What the checker finds | Verdict | Issue it lists |
|---|---|---|
| The final URL returns HTTP 400 or higher | Fail | The page returned HTTP 404 (or whatever code came back). |
| No canonical link tag | Fail | No canonical link tag was found. |
| Two or more different canonical URLs, in tags or the Link header | Fail | The page declares 2 different canonical URLs, so Google may ignore all of them. |
| The canonical URL returns 404 or 410 | Fail | The canonical URL returns HTTP 404, so Google cannot use it. |
| Two or more canonical tags with the same URL | Warning | 2 canonical link tags were found, all with the same URL. Google can use it, but two sources are printing the tag. |
| One canonical, same host, different URL | Warning | The canonical points to a different URL on the same site. |
| One canonical that differs from the page only by the www | Warning | The canonical is on example.com but the page is on www.example.com, a www and non-www mismatch. |
| One canonical on another domain | Warning | The canonical points to a different domain. |
| The canonical URL redirects, returns another error, or cannot be reached | Warning | The canonical URL redirects to the URL it ends on, returns HTTP and the code, or could not be checked, with the reason. |
| noindex or none in a robots or bot meta tag, or in X-Robots-Tag | Warning | A robots meta tag says noindex. The header, and none, get a line of their own. |
| One canonical equal to the final URL, status below 400, no noindex | Pass | No issues found. |
The match is exact. https://example.com/shoes and https://example.com/shoes/ are different URLs to the checker, and so are http and https, a change of case in the path, and any query string. That is deliberate: Google treats each of those as a separate URL too, and a canonical that differs by one slash is telling Google to index a different address.
A canonical that differs from the page only by the www is reported as a www and non-www mismatch, not as a different domain: it is two versions of your own site. The other version usually redirects back to the page, so a redirect warning comes with it. Fix both like the protocol case further down.
A fail for a missing canonical is the checker being strict, not Google. Google does not require the tag; without one it chooses a canonical from its other signals. On a page with no duplicates that is harmless. On WordPress it usually means no SEO plugin covers that page type, which the section on WordPress sources explains.
Reading each line of the report
Final URL is where the redirects ended. If it is not the URL you entered, the comparison was made against the destination. The redirect is worth a look in the Redirect Checker if it took more than one hop.
HTTP status is the final response code. Anything from 400 up fails the check outright, because Google does not index error pages or use their canonicals.
Canonical URLs lists every canonical found, already resolved to absolute URLs. One line is what you want. Two lines with the same URL are a warning: Google has no conflict to resolve, but two pieces of code are printing the tag, and the day one of them changes you have a real conflict. Two different URLs fail.
Link header canonical appears when the server sends a canonical in a Link header. It counts like a tag, so a header that names a different URL from the tag is a conflict. Canonical URL status appears when the canonical names another URL: the status that URL ends on, and where it redirects if it does.
Robots meta lists the content of each robots-type meta tag, without the crawler name. It includes tags aimed at other crawlers, such as bingbot, which Google ignores, so view the page source when you need to know which tag said what. Both noindex and the shorthand none, which means noindex, nofollow, are flagged. X-Robots-Tag appears when the server sends that header, and a noindex or none in it is flagged the same way.
Issues repeats the rules above in plain words. A page can collect several, such as a noindex and a canonical pointing elsewhere. That pair is worth fixing on its own, as the last section explains.
How Google uses the canonical you declare
A canonical tag is a hint, not a command. As of October 2026, Google’s documentation on consolidating duplicate URLs describes a permanent redirect and a rel=canonical link as strong signals, a sitemap listing as a weak one, and says Google prefers HTTPS over HTTP when other signals are equal. When the signals agree, Google usually follows them. When they disagree, it picks for itself.
The same documentation decides whether your tag counts at all. It must sit in the head of the HTML. It should be an absolute URL. It should not contradict another method, such as a sitemap that lists a different URL for the same page. And it should not be paired with noindex: noindex asks Google to drop the page, the canonical asks it to pass the page’s signals on, and Google advises against using noindex to steer canonical selection within a site.
Two cases trip people up. Paginated archives: page 2 and later should each declare their own URL, not page 1, because they list different posts. Syndicated articles: Google now recommends that sites republishing your content keep their copy out of the index with noindex, because a cross-domain canonical is unreliable when the two pages differ in layout and surrounding content.
What Google finally chose is visible in Search Console, not in this tool. The section on confirming the fix shows where to look.
Worked example: one post, four results
Illustrative values for a WordPress blog that serves https://www.example.com with trailing slashes. The same post was checked four different ways.
Pass after a redirect
Entered http://example.com/blue-widgets. Final URL: https://www.example.com/blue-widgets/. Canonical URLs: https://www.example.com/blue-widgets/. Verdict: Canonical looks healthy.
The http, non-www address redirected to the real one, and the destination names itself. This is the result you want for every post.
Warning on a tracking URL
Entered https://www.example.com/blue-widgets/?utm_source=newsletter. Canonical URLs: https://www.example.com/blue-widgets/. Issue: The canonical points to a different URL on the same site.
Expected and correct. The campaign URL defers to the clean one. Leave it.
Warning from a host mismatch
Before: Canonical URLs: https://example.com/blue-widgets/
After: Canonical URLs: https://www.example.com/blue-widgets/
The checker reported a www and non-www mismatch, because the tag dropped the www, and a redirect, because https://example.com/blue-widgets/ redirects back to the www page. Settings → General still listed the old address. Correcting it and purging the page cache turned the warnings into a pass.
Fail from two tags
Before: Canonical URLs: https://www.example.com/blue-widgets/ and https://www.example.com/?p=482
After: Canonical URLs: https://www.example.com/blue-widgets/
Yoast SEO printed the first tag and the theme’s header.php printed the second. Removing the theme’s line left one tag and a pass.
Only the last two needed work. That split is typical on a site with an SEO plugin: most warnings are parameter URLs doing their job, and the real problems are host mismatches and doubled tags.
Where a WordPress canonical comes from
Without an SEO plugin, WordPress core prints a canonical only on single posts, pages and attachment pages, including a static front page. A homepage that lists your latest posts, categories, tags, author and date archives get none. So a fail for No canonical link tag on a category page of a plugin-free site is WordPress working as designed.
Yoast SEO, Rank Math and SEOPress replace the core tag with their own and add one to archives as well. They build it from your permalink settings and site address, and a field in the post editor overrides it for a single page.
Every canonical WordPress or a plugin builds starts from Settings → General → WordPress Address (URL) and Site Address (URL). If those say http:// or leave out the www, so will every canonical, even while a redirect sends visitors to the right version. If the two fields are grayed out, WP_HOME and WP_SITEURL in wp-config.php set them, and that is where to change them.
Doubled tags have two usual sources: a theme that hard-codes a canonical in header.php, common in older and custom themes, and two SEO plugins active at once, which happens mid-switch from one to another. Page builders and some multilingual plugins can add a third.
Caching is the last layer. A page cache or CDN can keep serving HTML from before your change, so purge it before you run the check again.
Setting or clearing the canonical in each SEO plugin
Leave the field empty unless the page really is a copy of another. An empty field gives you a self-referencing canonical, which is what almost every page should have.
- 1.Yoast SEO: open the post, page, category or tag, open the Yoast SEO sidebar or the Yoast SEO box below the content, go to Advanced and edit Canonical URL.
- 2.Rank Math: open the post, click the Rank Math icon in the editor toolbar, go to the Advanced tab and edit Canonical URL.
- 3.SEOPress: open the post, scroll to the SEO metabox, open the Advanced tab and edit Canonical URL.
- 4.Theme: if the page source shows a second canonical that no plugin wrote, find rel="canonical" in the theme’s header.php and remove it in a child theme, or ask the theme author which setting turns it off.
- 5.Site address: correct Settings → General, or WP_HOME and WP_SITEURL in wp-config.php, and make the old version redirect to the new one in a single hop.
- 6.Purge the page cache and any CDN cache, then run the checker on the exact URL you changed.
Yoast’s documentation notes that it sets canonicals automatically and that you rarely need to change them, and the same holds for Rank Math and SEOPress. If you find yourself setting custom canonicals on many posts, the real fix usually belongs in a redirect or a site-wide setting.
Troubleshooting by symptom
These are the patterns that come up most on WordPress sites, with the cause to check first.
| What the report shows | Usual cause | Fix |
|---|---|---|
| Canonical uses http:// on an HTTPS site | Site Address still says http, or a proxy or CDN handles HTTPS and WordPress believes the request was plain http | Update Settings → General; behind a proxy, ask your host to pass the HTTPS state through to WordPress |
| Canonical names a staging or old domain | The database was migrated without replacing the old address, or a custom canonical was copied with it | Search and replace the old domain in the database, clear custom canonical fields, purge caches |
| Two canonicals, one ending in ?p= and a number | A theme printing its own tag next to the SEO plugin’s | Remove the theme’s tag in a child theme |
| Every page’s canonical is the homepage | Custom code or a theme option printing the site URL as the canonical | Remove it and let the SEO plugin build the tag |
| Page 2 of a category points to page 1 | An old theme or a custom rule | Let each page name itself; Yoast SEO and Rank Math do this by default |
| Error: Too many redirects | More than four redirects before the page | Trace the chain in the Redirect Checker and collapse it |
| Canonical correct here, Search Console shows Google chose another URL | Internal links, the sitemap or redirects favor the other version | Make every signal name the same URL |
Confirming that Google agrees
This checker shows what your page declares. Search Console shows what Google did with it. Open URL Inspection, paste the URL and read the Page indexing section: User-declared canonical is the tag Google read on its last crawl, and Google-selected canonical is the URL it chose to index.
If the two match, you are done. If the declared value is still the old one, Google has not recrawled since your fix. Click Test live URL to confirm the live page now declares the right URL. The live test shows the declared canonical but cannot tell you which URL Google will select, because that is decided at indexing time. Then use Request indexing on your most important URLs.
For patterns across many pages, use Indexing → Pages. Duplicate without user-selected canonical, Alternate page with proper canonical tag, and Duplicate, Google chose different canonical than user each list example URLs. After a fix, open the status and click Validate fix; Search Console rechecks the URLs over the following days or weeks. Don’t validate Alternate page with proper canonical tag: those URLs are meant to point elsewhere and will stay listed.
Across a whole WordPress site, RankHive makes this comparison every week from Search Console’s URL Inspection data, drafts the corrected canonical, and after you approve writes it into the canonical field of Yoast SEO, Rank Math or SEOPress.
When a warning is the right answer
A canonical that points elsewhere is correct whenever the URL you checked is a variant that should not rank on its own. Leave these alone: URLs with tracking or sort parameters, print versions pointing to the main article, a product variant URL pointing to its main product, and a partner’s copy of your article that points back to you.
A noindex warning is correct on thank-you pages, internal search results, and cart, checkout and account pages, which WooCommerce marks noindex itself. What you should not keep is noindex and a canonical to a different URL on the same page. Pick one: noindex if the page should drop out of search, a canonical if its signals should move to the other page.
A missing canonical on a small site with one host, one protocol and no parameter URLs is low priority, because Google has only one URL to choose. Installing an SEO plugin adds self-referencing canonicals everywhere, which is easier and safer than editing templates by hand.
FAQ about the Canonical Checker
Why does a canonical URL matter?
It tells Google which of several URLs showing the same content should be indexed and collect the signals, such as links, that point at any of them. Without it Google picks one itself, and on WordPress that can be a tag archive, a tracking-parameter URL or the http version instead of the post you want in results.
Is a self-referencing canonical okay?
Yes. It is the normal setup, and Yoast SEO, Rank Math and SEOPress add one to every indexable page. It costs nothing and means any parameter or alternate version of the URL that gets crawled later already points back to the original.
Does Google always follow my canonical tag?
No. It is a strong hint, not a rule. Google weighs it with redirects, internal links, the sitemap and HTTPS, and picks a different URL when those disagree or when the two pages are not really duplicates. URL Inspection in Search Console shows the canonical Google selected.
Why does the checker fail a page with no canonical tag?
Because without one you have handed the choice to Google. The checker is strict on purpose; Google does not require the tag. On WordPress without an SEO plugin, the homepage and archives have no canonical by design, so the usual fix is an SEO plugin rather than template edits.
What does a www and non-www mismatch mean?
The canonical and the page are on the two versions of your hostname, such as example.com and www.example.com, which Google treats as different URLs. Set Settings → General to the version you want and redirect the other version to it in one hop.
Should page 2 of a category canonicalize to page 1?
No. Each page in a paginated series should name itself as canonical, because page 2 lists different posts than page 1. Pointing them all at page 1 can stop Google from finding posts that are only linked from the later pages.
Can a canonical point to another domain?
Yes. Google supports cross-domain canonicals, for example when the same content runs on two sites you own. For articles someone else republishes, Google now recommends the partner noindex its copy instead, because a canonical between two differently built pages is not reliable.
Does the checker read canonicals set by JavaScript or in HTTP headers?
It reads the Link header, which PDFs and other files use, but not JavaScript: it only sees the HTML your server sends. For a canonical injected by JavaScript, open View tested page after a live test in URL Inspection to see what Google rendered, and move the tag into the server HTML if you can.