sfw/fix
meta refresh medium

Meta Refresh Redirect

A client-side <meta http-equiv="refresh"> redirect — Google calls it bad practice and it can index the wrong page.

What you see

<meta http-equiv="refresh" content="0;url=https://example.com/new-page">

What’s actually happening

The page sends visitors elsewhere using an HTML meta tag instead of a server redirect. The browser loads the original page, reads the tag, then jumps — so there's a flash of the old page, and the original URL lands in browser history (hit Back and you bounce forward again). Google's John Mueller has flatly called this bad practice: Google treats an instant meta refresh as a redirect signal and may decide the destination is the page to index, while a delayed one reads as temporary. You also pay a wasted round trip on every hit because the redirect happens after the page downloads.

Common causes

  • A migration done in HTML because the author couldn't (or didn't want to) touch server config — the path of least resistance, and the wrong one.
  • A page builder, CMS, or hosting panel that offers "redirect" as a meta-refresh snippet rather than a real HTTP redirect.
  • Legacy pages from an era when meta refresh was a common redirect method, never migrated to 301s.
  • A countdown/"you'll be redirected in 5 seconds" page, which Google reads as a temporary redirect.
  • Static hosting with no server-side redirect support, where meta refresh was used as a workaround.

How to fix it

  1. Replace it with a server-side 301For a permanent move, delete the meta tag and issue a real 301 from the server: `Redirect 301 /old /new` (Apache), `return 301 ...;` (Nginx), or your platform's redirect rule. A 301 transfers ranking cleanly and never flashes the old page.
  2. If you control no server, use the platform's redirect featureMost static hosts support real redirects without a server: Netlify `_redirects`, Cloudflare Pages/Workers rules, a Vercel `vercel.json` redirect, or your CDN's redirect rules. These return a true 301/302 — use them instead of a meta tag.
  3. Confirm the meta refresh is goneAfter switching, `curl -I https://example.com/old-page` should show the 301 in the HTTP headers. View source on the old URL and verify no `<meta http-equiv="refresh">` remains — leaving both a redirect and the tag is redundant and confusing.
  4. Keep meta refresh only for non-redirect usesThere's a legitimate narrow use — a true "this page moved, click here if not redirected" fallback shown to humans with a real 301 already in place. As the primary redirect mechanism for SEO-relevant URLs, replace it.

Stop it recurring

Use server-side or platform-level 301s for every permanent move and grep your templates for `http-equiv="refresh"` so a meta-refresh redirect never ships as the canonical method.

Related errors