Meta Refresh: What the Tag Does and How to Fix It
How the meta refresh tag works, why it hurts SEO and accessibility, and what our free SEO report checks on your page.
Free to use 6 min read Updated Oct 2026
What Is Meta Refresh? The Short Answer
Quick answer: A meta refresh is a meta tag in the head section, written as http-equiv="refresh", that makes the browser reload the page or jump to another URL after a delay. Our report fails any such tag it captures.
- Pass: no meta tag with http-equiv exactly equal to the lowercase word refresh.
- Fail: one or more, whatever the delay.
- Fix: delete the tag, or add a server side 301 redirect if the page moved.
It's free, and no account is needed.
What Does the Meta Refresh Tag Do in HTML?
The content attribute holds the refresh delay in seconds and, after a semicolon, an optional url parameter. You'll also hear it called a meta redirect, an HTML meta redirect or an HTML refresh tag. The WHATWG HTML Living Standard ignores case in the keyword and acts only on the first valid tag. New to head tags? See meta tags explained for beginners.
<meta http-equiv="refresh" content="300">
<meta http-equiv="refresh" content="5;url=https://example.com/">The first line is the classic auto refresh page trick for a live scores page. The second is a delayed redirect, and a delay of 0 makes it instant. Longer delays show the old page first.
Netscape Navigator 1.1 introduced the tag around 1995 as a polling trick. A matching Refresh HTTP header exists too, and browsers honour it, though it isn't in the HTTP standard. Confirm the syntax in the MDN http-equiv reference.
Is Meta Refresh Bad for SEO and Accessibility?
It isn't a penalty, but it's rarely ideal. Google Search Central reads an instant refresh as a permanent redirect and a delayed one as a temporary redirect, and calls the tag viable only without server side redirects. See its Google redirect guidance.
A 301 arrives with the response headers, while Googlebot rendering must parse the page to see a refresh, so the 301 is the clearer signal for indexing and link equity. Where a platform can't send one, an instant redirect with a visible link is the accepted compromise. See the technical SEO checklist for a site audit.
A bare reload fails technique F41 and WCAG 2.2.1 Timing Adjustable (Level A), and touches WCAG 2.2.4 Interruptions and WCAG 3.2.5 Change on Request, both Level AAA. An unexpected page reload causes a focus reset, so screen reader and keyboard users lose their place. An instant redirect is the form technique H76 accepts. Our check never reads the delay, so the 20 hour exception doesn't rescue a tag.
How SEO Site Checker Tests Meta Refresh
Headless Chromium loads your URL, waits for the load event, then reads the rendered HTML.
The exact rule: any meta element with http-equiv exactly lowercase refresh fails, whatever its content value.
What passes
Nothing in the rendered DOM matches, so you get a green tick, the message "This webpage is not using the Refresh meta tag" and no badge.
What fails
Head, body, noscript or script added tags all fail, with a red icon, the message "This webpage is using the Refresh meta tag", each content value in a badge and the How to Fix button.
What the check does not test
A capitalised Refresh runs in browsers but passes our case sensitive match. Chromium may follow a zero second redirect, or one lasting a second or two, before capture, so the report may grade the destination page instead. A Refresh HTTP header, a JavaScript redirect and a 302 redirect aren't read.
How to Remove or Replace a Meta Refresh Tag
- Find the tag. In view page source, search for http-equiv and read its value. Look through theme headers, plugins, custom head code and noscript blocks, and use Chrome DevTools for script-added tags.
- Replace a redirect. If content has ;url=, add a 301 for a permanent move, or a 302 redirect or 307 redirect for a temporary one, then delete the tag.
- Replace a reload. Delete a bare number, update only the changing region by script instead of location.reload, and add a pause control, as WCAG failure technique F41 expects.
- Re-test. Clear every cache, then run the report again.
Meta Refresh Alternatives for WordPress, Apache and Nginx
A server side redirect answers before any HTML is sent. For www and https cases, see the URL canonicalization guide.
| Platform | Where to do it | What to enter |
|---|---|---|
| Apache HTTP Server | htaccess redirect, mod_alias | Redirect 301 /old-page https://example.com/new-page |
| Nginx | Nginx return 301 in the server block | location = /old-page { return 301 https://example.com/new-page; } |
| WordPress | header.php or a plugin | Delete the tag, then use a redirect plugin |
| Shopify, Wix, Squarespace and Cloudflare | Built-in redirect tool or Redirect Rules | Old path to new destination, as a permanent 301 |
Meta Refresh Mistakes to Avoid
- Moving a whole site with a tag. A 301 is cleaner than content="0;url=...".
- Forgetting noscript. Our report reads the rendered HTML, so a noscript fallback still fails.
- Reloading forms. Auto reloading a checkout wipes what people typed.
- Letting a template print it. A shared header can start a redirect chain or redirect loop.
How to Fix
The short version, the same steps you see when you click How to Fix in your report.
Why this fails: your page contains a meta tag with http-equiv="refresh", which reloads it or sends visitors to another URL after a delay. Our report fails any lowercase refresh tag it finds in the rendered page, whatever the delay or destination, as long as the tag is still in the page when we capture it.
How to fix it:
- Find the tag in View Source by searching for http-equiv, or in DevTools Elements if a script adds it. Check theme header files, plugins, custom head code and noscript blocks.
- If it was a redirect (the content value has ;url=), add a server side 301 first for a permanent move, or a 302 or 307 for a temporary one, so visitors are never left on the old page.
- Delete the whole meta element.
- If it was a reload, update only the changing part with a short script and give users a way to pause it.
- Clear page, plugin and CDN caches.
<meta http-equiv="refresh" content="5;url=https://example.com/">To replace a redirect, add this line to .htaccess on Apache:
Redirect 301 /old-page https://example.com/new-pageOn Nginx, put this in the server block and reload:
location = /old-page { return 301 https://example.com/new-page; }For a page that needs fresh data, update one region and offer a pause control instead of reloading everything. Only inject markup from your own server:
let paused = false;
async function updateScores() {
const r = await fetch('/scores-fragment.html');
if (r.ok) document.getElementById('scores').innerHTML = await r.text();
}
setInterval(() => { if (!paused) updateScores(); }, 30000);
document.getElementById('pause').addEventListener('click', () => { paused = !paused; });- WordPress: use a redirect manager plugin or your host rules.
- Shopify, Wix and Squarespace: use the built-in URL redirect tool.
- Cloudflare: create a Redirect Rule at the edge.
Pitfall: a capitalised Refresh still runs in browsers, so remove it too.
Re-test: view the source again and search for http-equiv, ignoring case, and confirm none has the value refresh. curl runs no scripts, so use DevTools Elements for script-added tags. Then re-run the free SEO check and look for a green tick with no badge.
Frequently Asked Questions
What is a meta refresh?
Is a meta refresh bad for SEO?
Does Google follow a meta refresh redirect?
What is the difference between a meta refresh and a 301 redirect?
How do I remove a meta refresh tag?
What does a content value of 0 mean in a meta refresh tag?
Why is my meta refresh not working?
See how your site scores right now
Paste your address into the free report, then use the How to Fix button on anything that needs work.
Free to use. Results in under a minute for most sites.