Timed refresh must not exist (meta http-equiv=refresh)
A <meta http-equiv="refresh"> auto-reloads or redirects the page on a timer, yanking focus to the top with no way to stop it.
What you see
Timed refresh must not exist (meta-refresh) <meta http-equiv="refresh" content="30"> Element reloads the page after a delay shorter than 20 hours.
What’s actually happening
axe finds a <meta http-equiv="refresh"> with a delay under 20 hours, which makes the page reload (or jump to another URL) on a timer the user can't pause, stop, or extend. When it fires, focus snaps back to the top of the document. A screen reader user who was three paragraphs deep gets dumped at the start and has to find their place again; someone who reads slowly or uses a switch may never finish before the clock resets them. This fails WCAG 2.2.1 Timing Adjustable, and an auto-redirect form of it also trips 2.2.4 Interruptions. Sighted, fast readers barely register it, which is why it survives in dashboards and "session expiring" pages.
Common causes
- A dashboard or status page set to auto-refresh content every N seconds with a meta tag instead of fetch/AJAX
- A "you'll be redirected shortly" splash using meta refresh as the redirect mechanism
- Legacy markup from when meta refresh was the normal way to bounce a moved page
- A CMS or hosting panel offering "auto-refresh" or "redirect" as a meta-tag snippet
- A session-timeout page that reloads to log the user out, with no control to defer it
How to fix it
- Delete the tag and redirect server-side insteadIf the goal is a redirect, remove the meta tag and issue a real 301/302 from the server (Apache Redirect, Nginx return 301, or your platform's rule). It's faster, doesn't flash the old page, and never steals focus. This also clears the related SEO problem of a client-side redirect.
- Update content without reloading the whole pageFor a live dashboard, fetch new data with JavaScript and patch the DOM region that changed. The rest of the page — and the user's scroll position and focus — stays put. A full meta refresh to update one number is the wrong tool.
- If a timed action is truly required, make it adjustableWCAG passes a timer only when the user can turn it off, adjust it, or extend it before it acts. For a session timeout, show a warning with "Stay logged in" and at least 20 seconds to respond. A delay of 20 hours or more also passes the rule, but that's rarely what anyone wants.
- Confirm it's gone in the rendered sourceView source on the live URL and search for http-equiv="refresh" — it must be absent. If you swapped in a server redirect, curl -I should show the 3xx status in the headers and no refresh meta in the body.
Stop it recurring
Grep your templates for http-equiv="refresh" and route every redirect through a server-side or platform 301 so a timed meta refresh never ships.