How the checker follows a URL
Enter the old address, the one people and links actually use, not the page you expect to land on. The checker requests it and records the status code. If the answer is a 3xx with a Location header, it requests that location next, and keeps going until a page answers with something other than a redirect, a URL repeats, or it has made 10 requests.
Each request is a HEAD first, because a redirect only needs headers. If the server refuses HEAD with 403, 405 or 501, or fails to answer it, the checker sends a GET instead. When it reaches a page that is not a redirect, it sends a GET anyway and reads up to 120,000 bytes of the HTML, looking for two more kinds of redirect: a meta refresh tag, which it follows like an HTTP redirect, and a script that sends visitors elsewhere as the page loads, which it reports but does not follow. Every request gets 8 seconds.
Only a plain case counts as a JavaScript redirect: a statement at the top level of a script in the page that sets location or location.href to a fixed address, or calls location.replace or location.assign with one. A redirect inside a function, a condition or a click handler may never run, and an address built while the page runs cannot be read without running it, so neither is reported. A page can still redirect that way; check the page source if the report and the browser disagree.
Why it can disagree with your browser
- Your browser caches 301s, sometimes for a long time. After you change a rule, the browser can keep jumping to the old target while the checker sees the new one.
- A site on the browser’s HSTS list is upgraded to HTTPS before any request leaves your machine. Chrome shows that as a 307 Internal Redirect in DevTools; the server never sent it, so the checker will not show it.
- The checker sends no cookies and identifies itself as RankHiveTools. Redirects that depend on a login, a language cookie, a geolocation rule or a bot filter can behave differently for it than for you.
- It refuses any hop that points at a private or local address, so a redirect into an intranet or localhost ends the chain with an error rather than being followed.
Redirect types and how Google treats each
The Type column labels every hop. As of October 2026, Google’s redirect documentation splits them into permanent ones, which are a strong signal that the target should be the canonical URL, and temporary ones, which Google follows without treating the target as the replacement.
| Redirect | Type in the report | What Google does with it |
|---|---|---|
| 301 Moved Permanently | Permanent | Follows it and treats the target as the new canonical. The default for any move you mean to keep. |
| 308 Permanent Redirect | Permanent | Same as 301 for search. It also tells browsers to repeat a POST as a POST, which matters for forms and APIs, not for pages. |
| 302 Found | Temporary | Follows it but keeps treating the original URL as the one to index. |
| 303 See Other | Temporary | Normally sent after a form submission. On a page URL it is usually a misconfiguration. |
| 307 Temporary Redirect | Temporary | Treated like 302. A 307 you only see in the browser is usually HSTS, not your server. |
| Meta refresh | Meta refresh | Google treats an instant refresh as permanent and a delayed one as temporary, and recommends a server redirect where you can set one. |
| JavaScript location change | JavaScript | Seen only after Google renders the page, which can happen later than the crawl. Google lists it as the last resort. |
Googlebot follows up to 10 hops in one chain. Past that, Search Console reports a Redirect error for the URL. The checker’s limit is the same 10 requests, so a chain it cannot finish is one Google would not finish either.
Reading the report
Final URL is the last address in the chain. When it is not the page you meant to send people to, the rest of the report explains where the route went wrong.
Final status is the code that last address returned. A dash means it never answered: the hop was refused, timed out or failed DNS, and the reason is printed in red under that row in the Hops table.
Redirects counts the hops before the final page, including a meta refresh or JavaScript hop. One is ideal for an old URL. Zero means the address you entered is itself a page and nothing redirected.
Chain complete says Yes when the walk reached a page. Otherwise it says why it stopped: No, the chain loops when a URL came back a second time; No, hop limit reached when the URL was still redirecting after 10 requests; No, the last request failed when a hop never answered; and No, the last redirect has no usable target when a redirect came without a Location the checker could follow.
The Hops table lists each request in order with its status code, its type and the URL that was requested. A hop typed JavaScript shows the page that runs the script, with the address the script sends visitors to underneath. The checker does not follow it, so the chain ends there; run that address as a new check to see where it goes.
Every finding, and what to check first
Errors make the verdict Redirect chain has problems. Warnings alone make it Redirect chain has warnings. With neither, it reads Redirect chain looks healthy.
| Finding | Level | First thing to check |
|---|---|---|
| Loops back to a URL it already visited | Error | Two rules that undo each other, often trailing slash or www rules in different layers |
| Ends on HTTP 400 or higher | Error | The target was deleted, renamed again or mistyped in the rule |
| Ends on a URL that could not be loaded | Error | The reason printed under the last hop: a dead domain, a timeout, or a target on a private address |
| A hop goes from HTTPS down to HTTP | Error | A rule or the WordPress Site Address that still says http:// |
| Still redirecting at the hop limit | Warning | The same causes as a loop, with a longer cycle |
| Protocol and hostname changed in two separate hops | Warning | An HTTPS rule and a www rule set up in different places |
| More than two redirects before the final URL | Warning | Old rules pointing at URLs that were later redirected again |
| One or more temporary redirects | Warning | Whether the move is really temporary; if not, change the rule to 301 |
| A meta refresh instead of an HTTP redirect | Warning | A plugin, page builder or static HTML file doing the redirect |
| The final page redirects with JavaScript | Warning | A script in the theme, a landing page tool or a consent banner |
When the protocol and hostname warning appears, the more-than-two-redirects warning is held back even if the chain is long, because merging those two hops is the first fix and may be the only one needed.
A 3xx response with no Location header ends the chain too. The checker treats that hop as the final one and prints Redirect status with no Location header under it, which is a server bug rather than a rule to edit.
Worked example: four hops down to two
Illustrative values. A blog moved to HTTPS on the www hostname some years ago, and last month a post was renamed from old-post to new-post. A newsletter still links to http://example.com/old-post/. The checker reported a Redirects count of 3, a Final status of 200 and two warnings: The protocol change and the hostname change are handled as two separate hops, and One hop uses a temporary redirect.
The fix, re-checked
Before: http://example.com/old-post/ → https://example.com/old-post/ → https://www.example.com/old-post/ → https://www.example.com/new-post/
After: http://example.com/old-post/ → https://www.example.com/old-post/ → https://www.example.com/new-post/
One CDN rule now sends any http or non-www request straight to https://www, the host’s HTTPS setting was switched off so the two do not fight, and the plugin rule was changed from 302 to 301. Two permanent hops, no issues: Redirect chain looks healthy.
| Hop | Status and type | URL requested | Where the rule lived |
|---|---|---|---|
| 1 | 301 Permanent | http://example.com/old-post/ | The host’s Force HTTPS setting, which only changes the scheme |
| 2 | 301 Permanent | https://example.com/old-post/ | A CDN rule that adds www |
| 3 | 302 Temporary | https://www.example.com/old-post/ | A redirect plugin rule saved with the wrong type |
| 4 | 200 Final | https://www.example.com/new-post/ | The post |
Getting to a single hop would mean moving the post’s redirect into the CDN as well, which is rarely worth it for one URL. What is worth doing is updating your own internal links and the sitemap to point straight at new-post/, so that every click from inside the site skips the chain entirely.
Finding which layer sent each hop
A request to a WordPress site can be redirected by up to four layers before WordPress itself sees it, and each keeps its own rules. Fixing a chain starts with knowing which layer answered at every hop.
The CDN answers first. On Cloudflare, check SSL/TLS → Edge Certificates for Always Use HTTPS, the Rules section for Redirect Rules and Page Rules, and Bulk Redirects at the account level. Then the host: managed WordPress hosts such as Kinsta and WP Engine have redirect rules and HTTPS settings in their dashboards. Then the web server: .htaccess on Apache and LiteSpeed, or the site configuration on Nginx, which ignores .htaccess entirely.
Then WordPress core, which redirects more than most people expect, all with 301s: to the hostname in Settings → General when only the www differs, to add or remove a trailing slash to match your permalink structure, from ?p=123 style links to the pretty permalink, from a post’s old slug to its current one, and from a mistyped URL to its best guess at the post you meant. The old-slug redirect covers posts but not pages, so a renamed page needs a rule of its own. Core does not redirect http to https by itself; that comes from one of the other layers.
Finally the plugins: a redirect manager, an SEO plugin’s redirect module, an SSL plugin, a multilingual plugin or a maintenance-mode plugin.
The fastest way to tell them apart is the X-Redirect-By response header. Open DevTools, check Preserve log on the Network tab, load the old URL and click each redirect; or run curl -sI against each hop’s URL. WordPress sends X-Redirect-By: WordPress, the Redirection plugin sends redirection, and many other plugins send their own name. No header usually means the server, the host or the CDN.
Fixing the rule where it lives
Edit the rule in the layer that sent the hop. Adding a new rule somewhere else to cover a bad one is how most long chains are built.
- 1.Redirection plugin: Tools → Redirection, search for the source URL, edit the target or the HTTP code. Its URL monitor can add a redirect automatically each time a post’s permalink changes.
- 2.Rank Math: turn on the module in Rank Math SEO → Dashboard → Modules, then manage rules in Rank Math SEO → Redirections, where each rule has a type such as 301, 302, 307, 410 or 451.
- 3.Yoast SEO Premium: Yoast SEO → Redirects holds plain and regex redirects, including the ones Premium creates when you change a post’s URL.
- 4.SEOPress PRO: turn on Redirections / 404 in SEO → PRO, then manage rules under the Redirections menu, or use the Redirection tab in a post’s SEO metabox to redirect that post.
- 5.Server: edit .htaccess or the Nginx configuration, or ask your host, and keep a copy of the file before you change it.
- 6.CDN: edit or delete the Redirect Rule, Page Rule or Bulk Redirect list entry, then purge the CDN cache.
Automatic slug-change redirects are useful, but they build chains when a post is renamed twice: A redirects to B, then a new rule sends B to C. Edit the first rule so A goes straight to C, and keep the B rule for anyone who saved the middle address.
Loops have three common causes on WordPress. The Site Address says one hostname while a server rule forces the other. Cloudflare’s Flexible SSL mode talks to the server over http while WordPress or the server redirects to https, so every request bounces; switch the mode to Full (strict) once the server has a certificate. Or a trailing slash is added in one layer and removed in another. The checker shows the URLs repeating, which tells you which pair to compare.
Redirect problems by symptom
What the report shows, the cause that comes up most often on WordPress, and the fix.
| Symptom | Likely cause | Fix |
|---|---|---|
| The chain ends on a 404 | The target was renamed or deleted after the rule was made | Point the first rule at a live page, or remove it if nothing replaces the old one |
| Every old URL lands on the homepage | A catch-all rule or a 404 plugin that redirects everything home | Redirect each URL to its closest match; Google can treat mass redirects to an unrelated homepage as soft 404s |
| A 302 nobody chose | Theme or plugin code calling wp_redirect() without a status, which defaults to 302 | Change the call or the rule to 301, or ask the plugin author |
| An HTTPS to HTTP hop | A rule with an absolute http:// target, or a Site Address still on http | Correct the target or Settings → General, then purge caches |
| A meta refresh hop | A plugin set to redirect with a delay, or an old static HTML page | Replace it with a 301 in a redirect plugin or the server |
| Only one form of the old URL chains, with or without the slash | The rule matches one form exactly, so the other form takes an extra trailing-slash hop first | Turn on the redirect plugin’s option to ignore trailing slashes where it has one, or add the second form as its own rule |
| The browser lands somewhere else than the report | A cached 301, HSTS, or a cookie or location based rule | Test in a private window and trust the checker for what crawlers see |
Checking what Google recorded
In Search Console, inspect the old URL. Page with redirect under Page indexing means Google followed it and left the old URL out of the index, so only the target can be indexed; that is the outcome you want for an old address, not an error. Inspect the target too, and check that its Google-selected canonical is the target itself rather than the old URL, which can happen for a while after a 302 is corrected.
Indexing → Pages groups problem URLs under Redirect error. Google uses that status for a chain that is too long, a loop, a redirect URL that grows past the maximum URL length, and a bad or empty URL in the chain. After you fix the rules, re-run each example URL here, then open the status and click Validate fix.
For the URLs that matter most, run URL Inspection’s live test on the old address and use Request indexing on the target. Old URLs often stay in Google’s records long after you change them, so a recrawl is quicker than waiting.
On a WordPress site connected to RankHive, redirects are one of the fixes it can draft from its weekly read of your Search Console data. Nothing goes live until you approve it, its plugin then serves the redirect, and reverting it in the Change Log turns it off.
When a chain is fine as it is
One or two permanent hops ending on a 200 do not need work. A visitor on an old link barely notices, and Google follows both. Spend the time on chains that end in errors, loop, or carry a 302 for a move that is permanent.
Some temporary redirects are correct. Logged-out visits to /wp-admin/ get a 302 to wp-login.php, and that is how WordPress is supposed to work. A seasonal sale page that points to a holding page between campaigns, or a product that is briefly out of stock and points to its category, should stay 302 so the original URL keeps its place.
A warning on a URL nobody uses is not urgent either. If the old address has no links pointing at it and no traffic in Search Console, the redirect is a courtesy, and its shape does not matter much. Check the internal link side with the Broken Link Checker, which follows redirects and only reports links that end on an error.
FAQ about the Redirect Checker
What is wrong with a redirect chain?
Every hop is another request before the page starts loading, and each one is a rule that can break later. Two hops is usually fine. Longer chains are worth collapsing so the first rule points at the final URL, and most of them exist because the HTTPS redirect and the www redirect were set up as separate rules.
Should I use 301 or 302?
Use 301 for a permanent move, which is almost always what you mean. A 302 tells Google to keep the original URL indexed, so using one for a permanent change can leave the old address in results long after you replaced it.
What is the difference between 301 and 308, or 302 and 307?
For search, none: Google treats 308 like 301 and 307 like 302. The newer codes also require the browser to keep the request method, so a form POST stays a POST. That matters for applications, not for redirecting old pages.
How many redirects will Google follow?
Googlebot follows up to 10 hops in a chain, as of October 2026. Past that, the URL is reported as a Redirect error in Search Console. Google’s advice is still to redirect straight to the final URL, because a long chain is slow for visitors well before Google gives up.
Why does the checker show a different result than my browser?
Your browser remembers 301s and HSTS upgrades and sends your cookies, location and language. The checker starts fresh each time, sends no cookies and makes every request from a server. For what Googlebot sees, the checker’s view is the closer one; test in a private window to compare.
Does a redirect pass on the old page’s links and rankings?
A permanent redirect tells Google the target replaces the original, so the signals the old URL earned are consolidated there over time. Google has not published any percentage lost per hop. What does lose value is a redirect to an unrelated page, such as the homepage, which Google can treat as a soft 404.
Why is a meta refresh or JavaScript redirect flagged?
Both are slower and less dependable than a server redirect. A meta refresh needs the page to be downloaded first; a JavaScript redirect needs it to be rendered, which Google may do later than the crawl. They are fine as a last resort on hosting where you cannot set a 301.
How do I find which plugin created a redirect?
Look at the X-Redirect-By response header on that hop, in DevTools with Preserve log on or with curl -sI. WordPress core sends WordPress, the Redirection plugin sends redirection, and many plugins send their own name. If there is no header, check the server, host and CDN rules.