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
- 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.
- 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.
- 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.
- 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.