All fix guides
WarningOn-Page SEO

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. 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. 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, use return 301 https://example.com/new-page; inside the relevant location block. Then delete the <meta http-equiv="refresh"> tag from the page so you are not redirecting twice.

  3. 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. 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.js under redirects() with permanent: true, or use NextResponse.redirect() in middleware or a route handler. Never use a meta tag for this.

  5. 5

    Verify the new redirect returns the right status

    After deploying, test the old URL with curl -I https://example.com/old-page or a redirect checker. You want HTTP/1.1 301 Moved Permanently (or 302 if temporary) with a Location: 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.

Free tool
Check this with the Redirect Checker

Frequently asked

Does a meta refresh redirect pass SEO value like a 301?

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.

Is a meta refresh ever acceptable?

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.

What is the difference between a 301, a 302, and a meta refresh?

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.

Why does the Back button break on meta refresh pages?

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.

Will removing the meta refresh hurt my rankings?

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.

No signup needed. Results in under 60 seconds.

Related fixes