Fix Meta Refresh Redirects: Use a 301 Instead
A meta refresh redirect uses an HTML tag to bounce visitors to another URL after the page loads, instead of a server-side 301 or 302. Google can follow it but treats it as second-class: slower to process and less reliable at passing ranking signals. Replace it with a server-side 301 (permanent) or 302 (temporary) redirect.
What this means
Our audit found a <meta http-equiv="refresh"> tag on this page that sends visitors to a different URL. In your HTML <head> it looks like this:
<meta http-equiv="refresh" content="0; url=https://example.com/new-page">The content value is seconds; url=destination. A 0 fires the moment the page loads (an "instant" refresh). A higher number, like 5, shows the current page for a few seconds before jumping.
This is a client-side redirect. The browser downloads and parses the whole HTML page, then executes the refresh. A real HTTP 301 or 302 works differently: the redirect lives in the server's response headers, so the server tells the browser to go elsewhere before any page is rendered. Meta refresh is often left behind by old CMS plugins, "URL forwarding" from a domain registrar, or hand-coded "this page has moved" placeholders.
Why it matters
Google's documentation recommends a server-side redirect over meta refresh whenever possible. There are three concrete problems.
First, ranking signals. Googlebot does follow an instant (0-second) meta refresh and treats it as a permanent redirect, so some signals transfer. But Google has to fully fetch and parse the page before it sees the redirect, which is slower and less efficient than a 301 the server returns instantly. A delayed refresh (any non-zero timer) is worse: Google reads it as a temporary redirect, so the old URL stays indexed and ranking signals do not consolidate to the destination.
Second, user experience. A meta refresh loads a real page and pushes it into the browser's history, so the Back button can trap users: they hit Back, land on the refreshing page, and get bounced forward again. It also flashes a blank or intermediate page, which feels broken.
Third, AI answer engines. Crawlers behind ChatGPT, Perplexity, and Google's AI Overviews often fetch raw HTML and are less refresh-aware than Googlebot. A meta refresh page can get indexed as its own thin page instead of resolving to your real content, so the wrong URL or an empty placeholder ends up representing you in AI answers. A clean HTTP 301 is unambiguous to every crawler.
How to fix it
- 1
Confirm where the page should actually go
Open the flagged page's source and read the
url=value inside the meta refresh tag. That is the current destination. Decide whether the move is permanent (the old URL is retired for good, use a 301) or temporary (maintenance or a seasonal page, use a 302). This matters: a 301 tells Google to transfer ranking signals and eventually drop the old URL from the index, while a 302 tells it to keep the old URL. Also check for chains. If the destination itself redirects again, point directly at the final URL. - 2
Replace it with a server-side 301 redirect
Move the redirect out of the HTML and into the server response so the browser never renders the page. On Apache, add a line to
.htaccess:Redirect 301 /old-page https://example.com/new-page. On Nginx, usereturn 301 https://example.com/new-page;inside the relevantlocationblock. Then delete the<meta http-equiv="refresh">tag from the page so you are not redirecting twice. - 3
On a hosted CMS, use the built-in redirect tool
If you cannot touch server config, most platforms issue real 301s natively. WordPress: use the free Redirection plugin, or the Redirects module in Yoast SEO Premium or Rank Math, and add a 301 from the old path to the new URL. Shopify: go to Online Store > Navigation > View URL redirects and create a redirect there. Squarespace and Wix both have a URL redirects panel in their settings. After adding the redirect, remove any leftover meta refresh from the page or template so it isn't redirecting twice.
- 4
Handle registrar and framework cases
If the meta refresh comes from domain forwarding at your registrar (GoDaddy, Namecheap, and others), switch the forwarding type from masked or frame forwarding to a permanent (301) forward, or host a real redirect instead. On Cloudflare, use a Redirect Rule or Bulk Redirects with status 301. In Next.js, add the redirect to
next.config.jsunderredirects()withpermanent: true, or useNextResponse.redirect()in middleware or a route handler. Never use a meta tag for this. - 5
Verify the new redirect returns the right status
After deploying, test the old URL with
curl -I https://example.com/old-pageor a redirect checker. You wantHTTP/1.1 301 Moved Permanently(or302if temporary) with aLocation:header pointing at the destination, and no<meta refresh>in the served HTML. Re-run this page in the audit to confirm the warning clears, then request re-crawling of the old URL in Google Search Console so the change is picked up faster.
Frequently asked
Partly. Googlebot follows an instant (0-second) meta refresh and treats it as a permanent redirect, so some signals transfer. But it is slower and less efficient than a 301 because Google must fetch and parse the whole page first, and non-zero delayed refreshes are treated as temporary redirects that keep the old URL indexed. For reliable equity transfer, use a server-side 301.
Only as a fallback when you genuinely cannot issue a server-side redirect, for example on a static host with no access to headers or redirect tooling. In that narrow case, use an instant 0-second refresh, not a timed one. For almost every real platform (WordPress, Shopify, Cloudflare, Nginx, Apache), a proper 301 is available and preferable.
A 301 and 302 are HTTP status codes the server returns before any page loads. A 301 is permanent and transfers ranking signals; a 302 is temporary and keeps the original URL indexed. A meta refresh is an HTML tag in the page's head that runs in the browser after the page downloads. Server-side status codes are faster and more reliable for both users and crawlers.
Because the intermediate page actually loads and gets added to browser history. When a user presses Back, they land on the refreshing page again, which immediately bounces them forward, trapping them in a loop. A server-side redirect never enters browser history, so Back works normally.
No. Replacing it with a correctly targeted 301 to the same destination is an improvement. You are giving Google and AI crawlers a faster, clearer signal about where the content lives. Just make sure the 301 points to the final destination rather than through a chain, and update internal links to the new URL where you can.
Does your site have this issue?
Run a free, AI-powered audit and we’ll flag this and 150+ other checks in about a minute. No signup.