Page declares more than one canonical URL
This page carries the value canonical tags naming different URLs.
Why it matters
This page carries the value canonical tags naming different URLs. A page can only have one canonical, and search engines that find several conflicting declarations discard all of them — so the page ends up with no canonical at all, which is worse than the single wrong one you might have expected. This usually happens when a layout and a page both set a canonical, or when a CMS plugin adds one alongside the template's.
How ShipReady detects it
Search-engine basics, deliberately shallow. Lighthouse does SEO auditing thoroughly, for free, from Google, built into every browser. This module does not try to compete with that and should never grow to. It exists so a ShipReady report is not conspicuously silent on the subject, and it covers exactly the things a founder is likely to have got wrong without knowing — chiefly a `noindex` left over from staging, which makes a site invisible to search entirely. Every rule reads only the page HTML and response headers already fetched by PageContext. The module issues **no HTTP requests of its own**, which is why it can be this cheap: it is pure analysis of bytes the scan already has. Deliberately NOT covered: keyword analysis, backlinks, content quality, Core Web Vitals, and anything else that needs crawling or a second data source. Also not duplicated here: title, description, og:title, robots.txt, sitemap.xml and custom 404, all of which the readiness check already reports.
Detection is deterministic. ShipReady reports this only when it observes the condition directly, and prefers to miss a real problem over inventing one. Rule version 1.3.0.
How to fix it
This is the prompt ShipReady puts in your report — written to be pasted straight into Cursor, Claude Code, or whichever assistant built the app.
This page declares more than one <link rel="canonical"> tag with different URLs, so search engines discard all of them and the page ends up with no canonical at all. Find every place a canonical is emitted — typically your root layout AND the page itself, or a CMS/SEO plugin adding one alongside your template — and leave exactly one. In Next.js, set it in one place via `alternates: {{ canonical: '...' }}` in the metadata export and remove any hand-written <link rel="canonical"> from the layout. Verify by viewing source and confirming a single canonical tag.Frequently asked questions
- What does "Page declares more than one canonical URL" mean?
- This page carries the value canonical tags naming different URLs.
- How serious is it?
- ShipReady rates this medium. Fix soon. Meaningfully weakens a defence or degrades how the site works.
- How do I fix it?
- Paste the fix prompt on this page into Cursor, Claude Code or your AI editor. It is the same prompt ShipReady puts in your report.
- Can I check my own site?
- Yes — ShipReady scans up to ten pages of any public site for free and reports this alongside every other check. The free report lists every issue it finds and shows full evidence and a fix prompt for the critical and high-severity ones; medium and low findings are counted and unlock on Pro.
Related checks
Run this check on your site
ShipReady checks this and 193 other things across up to ten pages of your site, with an AI-ready fix for each. Free, no signup.