5.805 min read

301 vs 410 (and 404): How to Clean Up Old URLs Without Killing SEO

Key takeaways

  • If you changed direction, deleted pages, or migrated URLs: a practical decision tree for 301 vs 410 vs 404, how Google interprets each, and how to validate the cleanup in Search Console

If your site has any history, it has dead URLs.

Old posts you don’t want to be associated with anymore. Expired landing pages. Product pages that will never return. Slugs from a previous project.

And then Google Search Console becomes a graveyard:

  • “Not found (404)”
  • “Soft 404”
  • “Redirect error”
  • “Crawled — currently not indexed”

Most people try to “fix the report” instead of fixing the URL strategy.

This is the strategy.

One note for 2026: Google is increasingly good at ignoring “fake fixes” (like redirecting removed pages to the homepage). If the destination is not a real replacement, you don’t preserve value—you just create noise.

TL;DR: what status code should I return?

Use this decision tree:

  • 301 if there is a clear replacement and the intent is the same.
  • 410 if the URL is intentionally gone and you want it dropped faster.
  • 404 if the URL is unknown / mistyped / accidentally requested (or you’re not sure it’s gone forever).

The most common SEO mistake here: redirecting everything to the homepage “to save link juice”. That creates a soft-404 pattern (Google treats it like “not found” anyway) and it pollutes your site’s signals.

What Google actually does with 301 vs 410 vs 404

301 (Moved Permanently): consolidation

Google’s default interpretation:

  • “This content moved.”
  • “Transfer signals from old URL to the new URL (over time).”
  • “Replace the old URL in the index with the new one (eventually).”

When 301 is correct:

  • you renamed a slug
  • you changed a folder structure (/blog/a/articles/a)
  • you merged two pages into one and the new page truly matches the old intent

When 301 is wrong (and becomes a soft-404):

  • you redirect a removed page to the homepage
  • you redirect a specific page to a generic category that doesn’t answer the same query
  • you redirect “because 404 looks scary”

If Google thinks the destination is not a real replacement, it will:

  • keep showing the old URL as “Soft 404”, or
  • drop both URLs from the index, or
  • keep crawling dead ends longer than necessary

410 (Gone): explicit removal

410 is a strong signal:

  • “This URL is intentionally removed.”
  • “Don’t keep it around. Don’t expect it to return.”

In practice, 410 often gets dropped faster than 404, especially when the URL used to be indexed.

When 410 is correct:

  • you pivoted topics and want to clean the footprint
  • you removed low-quality content and there is no good replacement
  • you removed pages that create risk (thin pages, doorway patterns, old offers)

When 410 is not necessary:

  • a random typo URL
  • an old URL you don’t control (external sites linking wrong paths)

404 (Not Found): absence, not intent

404 is not “bad SEO”. It’s a normal web state.

404 is correct when:

  • the URL never existed
  • it existed, but you’re not sure it’s permanently gone
  • you want to avoid maintaining huge “gone lists”

Google can still drop 404 URLs from the index — it may just take longer for previously indexed pages.

The real goal: reduce noise, not chase perfect reports

You do not need “0 errors” in GSC.

You need:

  • a clear story of what pages matter now
  • a clean internal linking structure around them
  • no giant pool of low-value URLs consuming crawl/evaluation attention

If you want the mental model for why this matters, read:

How to do a clean site pivot (the practical workflow)

Step 1: export the legacy URL set

Sources:

  • GSC → Pages → “Not found (404)”, “Soft 404”, “Redirect error”
  • server logs (best)
  • analytics landing pages
  • old sitemaps / old CMS exports

Put everything into a sheet with:

  • old URL
  • status today
  • inbound links? (optional)
  • decision: 301 / 410 / 404
  • target URL (only for 301)

Step 2: choose 301 targets like a human

Rule: redirect to the page that answers the same question.

If you can’t name a single destination page confidently, it’s probably not a 301.

Good 301 mapping examples:

  • old “canonical vs redirect” → updated “canonical vs redirect”
  • old “308 redirect guide” → new “301 vs 308 guide”

Bad 301 mapping examples:

  • removed blog post → homepage
  • old product page → blog category

Step 3: mark truly obsolete URLs as 410

Make a list and return 410 for them. This is the cleanest way to say: “this was part of the old footprint; it’s gone.”

Step 4: remove internal references to dead URLs

If you keep linking to removed URLs internally, you’re telling Google they still matter.

Fix:

  • internal links
  • nav/footer links
  • sitemaps
  • RSS feeds / tag pages

Step 5: validate in GSC (don’t guess)

Use two tools:

  • URL Inspection on a few sample old URLs (one 301, one 410, one 404)
  • Pages report trend lines over 2–6 weeks

What you want to see:

  • “Not found (404)” stabilizes (it won’t go to zero)
  • “Soft 404” decreases (this is the real “bad” bucket)
  • coverage for your core pages improves (impressions/indexing)

How to implement 410 cleanly (Next.js example)

If you’re on Next.js, you can return 410 from middleware.ts (or from a route handler if you prefer).

Example pattern:

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const gone = new Set([
  '/blog/old-slug-you-removed',
  '/blog/another-legacy-url',
])

export function middleware(req: NextRequest) {
  const { pathname } = req.nextUrl
  if (gone.has(pathname)) {
    return new NextResponse('Gone', {
      status: 410,
      headers: {
        'content-type': 'text/plain; charset=utf-8',
        // Let CDNs cache the status so crawlers stop wasting cycles.
        // Tune to your setup; the key is: cache the 410, not the HTML of your normal pages.
        'cache-control': 'public, max-age=0, s-maxage=86400',
      },
    })
  }
  return NextResponse.next()
}

Notes:

  • You don’t need a fancy HTML page for 410. A plain response is fine.
  • If you do render a custom 410 page, keep it simple (and do not redirect).

FAQ

Does 410 “hurt” the domain?

No — if the URL is truly obsolete. What hurts is keeping a lot of low-value URLs alive (or “soft-404 redirecting” them) so Google keeps re-evaluating junk.

Should I always use 410 for removed pages?

No. Use 410 for intentional cleanup (especially after a pivot). Use 404 for the messy long tail of random/typo URLs.

If I return 410, do I still need to remove it from the sitemap?

Yes. Sitemaps are a “please crawl this” hint. Don’t ask Google to crawl URLs you intentionally removed.


If you want, tell me your situation (pivot / migration / cleanup after content pruning) and I’ll give you a 10-minute mapping plan: which buckets to 301 vs 410, and what to ignore.

Next in SEO & Search

View topic hub