Skip to content
WebInsights

Redirects that do not rot — one hop, or you have not moved the URL

You have moved the URL when the old hop lands in one 301. A chain is a hope you call a redirect.

A 301 only counts for SEO if it lands on the right URL in one hop. Chains, forever-302s and campaign URLs you forgot are how the move rots after Monday.

14 min read
Stylised browser window with a URL path that lands in one place — a 301 without a chain, not a spreadsheet of arrows you opened at relaunch and never again.

Web & SEO

If you are searching for redirect chain, or for 301 vs 302, you are usually here: a URL you thought you had moved lands somewhere other than you said — or it lands three times before it does. Someone has an .htaccess from the agency that still points at a page you deleted in the spring. Someone set a 302 'until we are sure' and left it for two years. Someone has A→B because B was the new slug, and B→C because C became canonical, and nobody deleted the first hop. Someone sends every unknown path to the homepage and calls it 'preserved SEO'.

The relaunch post is the cutover plan: a 1:1 map, crawl control, the Monday you switch. The error-page post is chrome on 404 and 500. This one is the habit after Monday — the inventory you actually own. An honest redirect is a sentence: this old URL now lives there, in one hop, with the status you mean. Without that sentence you have a rule someone hid. You have not moved the URL.

TL;DR

The main points

  • One hop. A 301 to the canonical URL. A chain is a hop you forgot to delete.
  • 301 is the move. 302 is temporary — Google treats it as what you wrote, not what you hoped.
  • A 200 on a dead URL is worse than an honest 404. A soft 404 is a lie the crawl spends time on.
  • The inventory is the code — next.config, _redirects, nginx — not a spreadsheet from the relaunch.
  • Campaign URLs, old PDFs and trailing-slash duplicates are what rot first.
  • The relaunch post is cutover. This one is refusing to let the hop rot the next time someone changes a slug.

Why this matters at all

A redirect is a promise to two parties: the person with a bookmark or a link in an email, and the crawler that holds a signal you would like to keep. The promise holds when the old hop lands on the right page in one 301. It rots when you stack a hop on a hop, leave a 302 standing, or answer 200 on something that is no longer a page. You think you have moved the URL. You have moved the pain to a place you do not look.

Chains are not a cosmetic problem. Each extra hop is crawl budget you donate, and a place a client or a bot can stop. An A→B→C where C later became 404 is three chances to lose what you thought you had saved. A loop is worse: you have asked the browser to stay. Teams notice when PageSpeed or a crawl tool shows 'redirect chain' on a URL they promised was canonical. They fix that one. They do not touch the inventory.

302 vs 301 is the choice you make when you are unsure, and forget to come back. A 302 says temporary. The search engine is allowed to treat it as that. If the job was 'the old slug is dead, the new one is home', 301 is the word. If the job was 'we are A/B-testing a landing page for two weeks', 302 is right — and you owe a date when it either becomes 301 or goes away. A 302 without an owner is how you have a temporary hop for three years.

We write this because 'we have redirects' has become a checkbox you tick at go-live and never open again. An honest setup is boring: one hop per old URL, 301 when the move is real, 404 when the page is dead, and a queue you actually work. Without that habit you have a file from the agency. You do not have an inventory.

What a redirect actually is — and what 301 vs 302 is not

A redirect is a named promise: this URL is no longer here; it lives there. The status code is part of the promise. 301 and 308 say permanent. 302 and 307 say temporary. The difference between 301/302 and 308/307 is whether the method may change — relevant for forms and API calls, rarely for an old blog post. For a marketing site the sentence is almost always: 301, one hop, to the canonical. Everything else is an exception you should be able to explain.

It is not a canonical tag. Canonical says 'of the pages that exist, this is the preferred one'. Redirect says 'this URL no longer exists as a page'. Mix the two and you have a URL that 200s with a canonical to another host while you also 301 a third place. The crawler chooses. You have not. Canonical is for duplicates you still serve. Redirect is for URLs you no longer want inside.

It is not a sitemap entry either. The sitemap tells what you want crawled now. The redirect inventory tells what you owe the URLs you no longer want crawled as themselves. Deleting a slug from the sitemap and letting it 404 without deciding that is not hygiene. 301ing every unknown path to the homepage is not hygiene either: it is a soft 404 with a 200 on the destination, and the crawler learns that your homepage is the answer to everything dead.

And it is not 'a rule in the WordPress plugin you toggle on'. A plugin that auto-301s on a slug change is a tool. It is not ownership. The plugin remembers the last change. It does not remember last autumn's campaign, the PDF you moved, or that you now run Next.js and the old .htaccess is no longer read. The inventory is the file you deploy. Everything else is a hope you parked with a vendor.

What usually goes wrong when someone says we have redirects

The first failure is stacking hops. You change the slug again. The plugin or next.config adds B→C. A→B stays. A year later it is A→B→C→D, and D is a 404 because someone cleaned 'unused pages'. The relaunch post is having the map on cutover day. Here the duty is to collapse the chain every time you move. An inventory you only open at relaunch is how redirects rot.

The second failure is the 302 you never made permanent. 'We are not sure about the new URL.' That is honest for two weeks. It is a lie for two years. The search engine was told the move is temporary. You were told you would come back. Nobody did. Write the date, or write 301. A 302 without an owner is a temporary hop you have turned into architecture.

The third failure is regex that swallows what you did not mean. A catch-all that drops the query string, so UTM and pagination land wrong. A trailing-slash rule that chains with the www rule that chains with http→https, so one bookmark is four hops. Write the few you owe, explicitly. A clever star is how you 301 `/blog/foo` to `/` because you meant `/blog/:slug`. Test with the URLs you actually have out in emails.

The fourth failure is the soft 404 and the homepage funnel. An SPA that 200s every path and renders 'page not found' in the client. A WordPress theme that shows a search result with 200. A rule that sends unknown URLs home 'so we do not lose the link'. You have told the crawler it is a page. It is not. The error-page post is chrome. Here the duty is to let a dead URL be dead — 404 or 410 — or to move it in one 301 to something that actually replaces it.

Inventory in code vs. a spreadsheet from the agency

The honest inventory

Every old URL is a line you deploy. You can point at it, test it, delete it.

  • next.config, _redirects, nginx, or the one plugin you actually read at deploy — one place, not three
  • One hop to the canonical. Chains collapse when the slug changes again
  • 301 when the move is real. 404/410 when the page is dead. 302 only with an owner and a date
  • Is boring to maintain, and that is the point — it does not rot in a mail

The rotting hop

A map from the relaunch, an .htaccess you no longer serve, three plugins that all 301.

  • The spreadsheet was right at go-live. It was not updated when someone changed a slug on Tuesday
  • Chains and 302s 'until we are sure' — without anyone becoming sure
  • Everything unknown to the homepage, so you can say you 'preserved SEO'
  • Is a hope you call a redirect. The crawler and the bookmark pay for it

How to decide whether you even have a redirect problem — and what you own

Without this order you get another rule you call an inventory.

  1. 01

    List the URLs you owe an answer — not the URLs you can invent

    Old sitemap. Search Console. Campaign links in mail. PDFs you have shared. The slug changes you made this year. If the list is 'everything that 404s, send home', you do not have a redirect problem. You have a 'someone said SEO' problem. Write the URLs that actually have somewhere to land. The rest may 404 honestly.

  2. 02

    Collapse the chains before you add a new hop

    Crawl the old URLs. Count hops. If A still points at B, and B now points at C, point A at C and delete the B hop if B is no longer a URL you want inside. The relaunch post is the map. Here is refusing to let the map grow. A hop you cannot explain in one sentence is a hop you should delete or fix.

  3. 03

    Pick status from the job, not from habit

    The page is replaced: 301 in one hop. The page is temporarily down or you are testing: 302 with a date. The page is dead and nothing replaces it: 404 or 410. You are unsure: that is not a 302 for two years. That is deciding whether a replacement exists. A 302 is a promise to come back. Write who comes back.

  4. 04

    Put the inventory where you actually deploy

    Next.js: redirects in config or on the platform. Cloudflare: in one rule set, not three. WordPress: one plugin you can export, not two that fight. An .htaccess on a host you have left is a ghost. Test with curl after deploy — status, Location, hop count — not with 'it worked in the browser once'.

  5. 05

    Give the queue an interval, not only a go-live

    When someone changes a slug, the inventory updates the same day. When a campaign ends, you decide whether the landing URL 301s to something alive or 404s. The monitoring post is seeing the 404 queue. Here is owning it: an honest 404 is finished work. A 404 you 'just needed to 301' for half a year is a hop you never wrote.

“You have moved the URL when the old hop lands in one 301. A chain is a hope you call a redirect.”

Relaunch, campaigns, www and the old PDF — same word, four jobs

Relaunch is the job that is most often right as a 1:1 map, and most often rots as a spreadsheet. The relaunch post is parity and cutover. Here the duty afterwards: every new slug change collapses the chain. You are not moving 'the site'. You are moving the URLs you still owe. If the new stack does not read the old .htaccess, cutover is not done. You have changed host. You have not moved the hops.

Campaign URLs are the job you forget because they do not look like 'the site'. /spring-offer, /lp/webinar-may, a UTM landing you promised in a newsletter. When the campaign is dead, the URL is too — unless you 301 to what actually replaces it, or 404 on purpose. Leaving it 200 as an empty template is a soft 404. Sending it home is telling the crawler the homepage is the offer. Write the replacement, or write 404.

www, https and trailing slash are the job that most often becomes four hops. http://www.example.com/foo/ → https://www… → https://example.com/foo/ → https://example.com/foo. That is one canonical URL you have turned into a chain. Set the canonical. Let the other three 301 straight there. The performance post is LCP. Here is refusing to let a bookmark pay four RTTs for a slash you would not own as content.

Old PDFs, attachments and 'download the price list' are the job that most often 404s in a mail someone forwards again. If the file moved, it is a 301 to the new file or to the page that replaces it. If the file is dead on purpose, it is 404 — not a hop to the homepage so you can say the link 'works'. A document you have shared in the world is a URL you owe an answer. It is not 'just a file in /public'.

What you should typically do in the situation you are in

The left is what you typically say. The right is the next step we typically recommend.

  • Situation

    You have a spreadsheet from the relaunch and a new slug change on Tuesday

    Next step

    Move the inventory into what you deploy. Collapse the chain. The spreadsheet is a memory

  • Situation

    A 302 has stood 'until we are sure', and nobody remembers the date

    Next step

    Decide whether a replacement exists. 301 in one hop, or 404. Uncertainty is not a status code

  • Situation

    Unknown URLs 301 to the homepage so you 'do not lose SEO'

    Next step

    That is a soft 404. 404 the dead. 301 only when the destination actually replaces the page

  • Situation

    http, www and slash are three rules that chain

    Next step

    One canonical URL. The others 301 straight there — not across each other

  • Situation

    You crawl and see A→B→C, and C is 404

    Next step

    Delete the chain. A should 404, or A should 301 to something alive. B is not a destination

Checklist before you call it a redirect inventory

If you are missing several of these, the sentence is we have redirects — the setup is a file you do not open.

  • You can point at the place you deploy the hops, and it is one place — not three plugins and an old host
  • The URLs you owe land in one hop on something that actually replaces them — or they 404 on purpose
  • 301 is permanent. 302 has an owner and a date. Catch-all to the homepage is not a strategy
  • Chains collapse when a slug changes. You sample-crawl after deploy, not only at go-live
  • Campaign URLs and PDFs are in the queue — not only 'the pages on the new site'
  • Error-page chrome and the relaunch map are other jobs. This one is the habit after Monday

Questions we get again and again

  • What is the difference between 301 and 302 for SEO?

    301 and 308 say the move is permanent. 302 and 307 say temporary. If the old URL is not coming back, 301 is the word — one hop to what replaces it. A 302 'until we are sure' is honest for two weeks and a lie for two years: the search engine was told the hop is not home. Uncertainty is not a status code. Decide whether a replacement exists, write 301, or write 404. The relaunch post is when you switch. Here is meaning the status you send.

  • Why is a redirect chain a problem?

    Because each extra hop is a place you can forget to update, and crawl budget you donate. A→B→C, where C later died, is three chances to lose what you thought you had moved. A loop is worse. Collapse the chain: the original hop should land on the canonical in one 301, or it should 404. 'It works in the browser' is not an inventory. The browser follows. The crawler and the mail client do not have to do it the same number of times.

  • May we send every 404 to the homepage so we keep the links?

    No. That is a soft 404: you tell the crawler the homepage is the answer to a dead URL. The link is not kept. It is redirected to something that does not replace the page. 301 only when the destination actually is the replacement. 404 or 410 when the page is dead. The error-page post is the screen a human sees. Here the duty is to let the status be true. A homepage funnel is a hope you call SEO.

  • Where should redirects live when we move from WordPress to Next.js?

    Where the new host actually reads at deploy: next.config, the platform redirect file, or the edge — one place. The old .htaccess and Yoast redirects die with the old host unless you export them and collapse the chains first. The relaunch post is the cutover map. This one is refusing to leave the map on the server you turned off. Test with curl after cutover. A hop you cannot see in the new config is a hop you have lost.

  • Is this the same as relaunching without losing rankings?

    No. The relaunch post is the plan: parity, a 1:1 map, crawl control, the Monday you switch. This one is the habit after: Tuesday's slug change, the campaign that ended, the chain you did not collapse, the 302 you forgot. You can have a perfect cutover and still rot the inventory in three months. The monitoring post is seeing the 404 queue. Here is owning the hop so the queue is not full of URLs you promised to move.

If you have a spreadsheet from the relaunch and a chain in the crawl

Let us separate one 301 from a hope you call a redirect.

An inventory you deploy beats an .htaccess you left on the old host.

Why we wrote this

This is how we think — and it's what we build.

Our insights are about the work we actually do. If this hit something you're working on, there's a concrete service that lines up.