# canonical vs redirect — which to choose and when

> rel=canonical and a 301 solve different problems: one keeps the URL, the other removes it. When to use canonical, when to redirect, common mistakes, and the impact on indexing.

_Source: https://seomatrix.ai/blog/canonical-vs-redirect/ · Updated: 2026-06-28_

---

`rel="canonical"` and a 301 redirect get confused because both "consolidate" duplicates and pass signals to the primary version. But they do different jobs, and the choice isn't interchangeable.

> In short: a **301 removes the URL** (the old address is gone), while **canonical keeps the URL** working and just marks the primary version. A move is a 301. Several live URLs with the same content is a canonical.

## What each one actually does

- **A 301 redirect** is a permanent forward. Both user and bot land on the new URL; the old one ceases to exist and drops out of the index over time. It's a **directive**.
- **`rel="canonical"`** is a tag in `<head>` (or an HTTP `Link` header) that says: "this content has several addresses, the primary one is this." All URLs stay open and working. It's a **hint** — the engine weighs it alongside other signals (internal links, sitemap, redirects) and may choose a different canonical if signals conflict.

Both consolidate link signals onto the chosen version (in Google's field terms, the link is made via `forwardingdup` / a canonical pointer). The difference is the strength of the signal and whether the original URL stays alive.

## When to use canonical

When both (or all) versions must **stay accessible**, but [only one belongs in the index](/tools/indexability/):

- **URL parameters** — `?utm=…`, `?sort=`, `?sessionid=`, filters → canonical to the clean URL.
- **Print / AMP / mobile duplicate** → canonical to the primary.
- **One product via several paths** (`/catalog/item` and `/sale/item`) where both links are needed → canonical to the canonical one.
- **Syndication / republishing** on another domain → canonical to the original (cross-domain canonical is allowed).
- **Minor variations** (sorting, display region) with identical content.

## When to use a redirect (301)

When the old URL **should not exist**:

- The page genuinely **moved**, the slug/structure changed.
- **Domain change**, consolidating `http→https`, `www` ↔ non-`www`.
- A **removed product/page** — 301 to a relevant replacement (not the homepage — that's a "soft 404").
- Merging two similar pages into one.

> For the redirect codes themselves (301/302/307/308) and which to use when, see **[301, 302, 307, 308 — the difference](/blog/301-302-307-308-redirects/)**.

## Table: canonical vs 301

| | `rel="canonical"` | 301 redirect |
|---|---|---|
| Original URL | Stays live | Ceases to exist |
| Signal type | Hint (can be ignored) | Directive |
| Signal consolidation | Yes, to the canonical | Yes, to the target |
| User sees | The current page | The new page immediately |
| When | Several live duplicates | A permanent move |

## Common mistakes

1. **Canonical to a redirecting or 404 URL** — the canonical must return 200. Otherwise the signal is contradictory and gets ignored.
2. **Canonical + noindex on the same page** — a conflict: you're saying both "index that version" and "don't index." Drop one.
3. **Canonical chains** (A → canonical B, B → canonical C) — point straight to the final canonical URL.
4. **Paginated pages under one canonical** — don't canonicalize pages 2…N to the first; each listing page is self-canonical.
5. **Relative / inconsistent canonical** — use an absolute URL with consistent case and slashes; canonical, sitemap and internal links must point to the same address.
6. **A redirect where you needed canonical** (and vice versa) — if both pages must stay live, a 301 "kills" one; if a page moved for good, canonical leaves the old URL in the results.

## canonical and AI search (GEO)

AI engines, like search engines, pick **one** version of the content to cite. Conflicting signals (canonical one way, internal links and redirects another) blur the choice and scatter authority across duplicates. A clear, consistent canonical (or an honest 301 on a move) helps the engine lock onto **one** citable URL — and accumulate signals there.

## How to check

1. View the page source or the [response headers](/tools/response-headers/) — find `rel="canonical"` and confirm it's absolute and points to the intended URL.
2. Run the canonical URL through the [redirect checker](/tools/redirect-check/) — it must return **200**, not a redirect/404.
3. Cross-check: canonical, sitemap and internal links all point to the same address.

> Want the technical side — canonicals, redirects, duplicates, indexing — run by an autonomous AI team from audit to fixes? Take a look at the [homepage](/) or the [comparison](/compare/).

## Sources

- Google Search Central — Consolidate duplicate URLs / canonicalization (canonical as a hint, canonical chosen from the full set of signals).
- MDN Web Docs — HTTP redirections, `Link: rel="canonical"`.
- Google Content Warehouse API leak (2024) — `forwardingdup` / canonical pointer: CompositeDoc consolidation and signal transfer.

## FAQ

### What's the difference between canonical and a 301?

A 301 physically moves both user and bot to another URL — the old address is gone. rel=canonical keeps every URL working but tells the engine which is the primary version. A 301 is a directive; canonical is a hint (the engine may pick a different canonical URL).

### Does canonical pass equity like a 301?

Both consolidate signals onto the primary version. But canonical is a hint: if signals conflict (internal links, sitemap, redirects point to a different URL), the engine may ignore your canonical. A 301 is more reliable when the duplicate shouldn't exist.

### When canonical, when a redirect?

If both pages must stay accessible (one product via several paths, UTM/sort/print variants) — canonical. If a page genuinely moved and the old URL isn't needed — 301.

### Can I point canonical at a redirecting or 404 URL?

No. The canonical URL must return 200. A canonical to a redirecting, 404 or noindex page is a conflicting signal — the engine will ignore it and pick a canonical itself.

