sfw/fix
302 used instead of 301 high

302 Found used for a permanent move

A temporary 302/307 on a permanently moved URL keeps signals split between old and new, so rankings stall.

What you see

Page with redirect
HTTP/1.1 302 Found
Location: https://example.com/new-url

What’s actually happening

You moved a page or changed a URL months ago, but the old URL still ranks while the new one struggles to gain traction. Checking headers shows the old URL answers 302 (or 307) instead of 301. Search Console keeps the old URL indexed and treats the move as provisional, so link equity sits between both versions instead of consolidating onto the destination.

Common causes

  • Framework defaults to a temporary redirect: Next.js redirect() without permanent: true, or Express res.redirect() which defaults to 302.
  • A migration or HTTPS rollout used 302 because it was the platform's one-click option.
  • Someone set a 302 during testing or a phased rollout and never switched it to 301 after the move went live.
  • A CDN or load balancer rule (Cloudflare, nginx) issues 302 because the directive omitted the permanent flag.
  • The redirect was deliberately temporary once but the original page was later deleted for good.

How to fix it

  1. Change the redirect to 301 (or 308)Use 301 for normal page/URL moves. In nginx: return 301 https://example.com/new-url. In Apache: Redirect 301 /old /new. In Next.js: { permanent: true }. Use 308 instead of 301 only if the endpoint receives POST and must keep the method and body.
  2. Confirm the status code changedcurl -sI https://example.com/old-url | head -1 should print HTTP/2 301. Don't trust the framework's label; check the wire.
  3. Make sure the 301 lands on a live 200 URLPoint it at the final destination that returns 200, not at another redirect (avoid chains) and not at a dead page. Test the destination directly.
  4. Resubmit and let Google reprocessUse URL Inspection on the old URL to confirm Google now sees a permanent redirect, then request indexing on the new URL. Consolidation takes a few crawl cycles.

Stop it recurring

Default to 301/308 for anything you don't intend to undo, and grep your redirect config for 302 before shipping a migration.

Related errors