"Page with redirect" in Search Console: what it means on a WordPress site, and which ones to fix
"Page with redirect" lists addresses that answered Google with a redirect. The address is not indexed. The page it leads to can be. On a WordPress site the list is usually old and alternative addresses that WordPress forwards by itself, and they need nothing. A few can be wrong.
- By
- WP Ministry
- Published
- Tested on
- WordPress 7.1.3, PHP 8.3.35
In short
- The status is a list of addresses that redirect. Google does not index such an address. It can index the page the address leads to.
- An address in the list is correct whenever the redirect is one you meant. It is the record that an old or alternative address leads somewhere, and WordPress makes several such redirects by itself.
- WordPress redirects many forms of an address by itself. A missing final slash, a ?p= address, a renamed post's old slug and www against the bare name are four.
- Read the list by where each address ends. One loop prints the first answer, the number of redirects and the final address.
- Worth fixing are a redirect listed in a sitemap, your own links to an old address, a chain, a 302 on a permanent move, and a page that should not redirect at all.
- Validation is for a status you have removed. An address that is meant to redirect goes on redirecting.
"Page with redirect" in Search Console's Page indexing report is a list of addresses that answered Google with a redirect. Google does not index an address that redirects. It can index the page the address leads to. An address in this list is correct, and needs nothing done, whenever the redirect is one you meant: it is the record that an old or alternative address leads somewhere. WordPress makes several such redirects by itself, and the table below shows them.
A WordPress site makes many such redirects by itself, which is why the list can be long on a healthy site. This page shows which redirects those are, then how to find the few that are wrong.
What Google says the status means
Google's help for the report files this status under "Not indexed", a group it introduces as pages that are not indexed "but not necessarily because of an error". Of this status it says the listed address is "a non-canonical URL that redirects to another page" and will not be indexed. Whether the page it leads to is indexed depends on what Google thinks of that page.
Three more things from the same help page:
- The list is a sample. It is an example list, limited to 1,000 rows, and does not necessarily show every address with the status.
- "Website" as the Source is not a verdict. The help says the Source shows whether a reason is probably something you can fix. It does not say that you should.
- "Redirect error" is a different status. The help gives it four causes: a redirect chain that was too long, a redirect loop, a redirect address that grew past the maximum length, and a bad or empty address in the chain. There, Google could not follow the redirect to an end. Under "Page with redirect" it could. A loop that browsers report too is covered in how to fix ERR_TOO_MANY_REDIRECTS.
The redirects WordPress makes by itself
This is what a WordPress site answered to each form of an address. It was on "Post name" permalinks with the bare domain in its settings, and one post's slug had been changed from summer-sale to june-offer. The last column is the X-Redirect-By header of the answer, which names what sent it.
| Asked for | Answer | Sent by |
|---|---|---|
/hello-world, a post without its final slash | 301 to /hello-world/ | WordPress |
/?p=123, a post by its number | 301 to the post's address | WordPress |
/?page_id=2, /?cat=1, /?author=1 | 301 to the page, the category archive, the author archive | WordPress |
/summer-sale/, the post's slug before it was changed | 301 to /june-offer/ | WordPress |
www.example.com/hello-world | 301 to example.com/hello-world/, host and slash in one hop | WordPress |
/feed, /feed/rss2/, /feed/rss/, /rss/, /?feed=rss2 | 301 to /feed/ | WordPress |
/index.php/hello-world/ | 301 to /hello-world/ | WordPress |
/hello-world/2/, page 2 of a post that has only one page | 301 to /hello-world/ | WordPress |
/page/1/ | 301 to / | WordPress |
/sitemap.xml, with no such file on the server | 301 to /wp-sitemap.xml | WordPress |
/admin, /dashboard | 302 to /wp-admin/ | WordPress |
/login | 302 to /wp-login.php | WordPress |
/wp-admin/, not logged in | 302 to the login page | WordPress |
/wp-admin | 301 to /wp-admin/ | No header. The web server sent it |
Not every other form is forwarded. /feed/, /feed/atom/ and /comments/feed/ answered 200, because they are feeds. /Hello-World/ in capitals answered 200 as typed. /page/2/, on a site with one page of posts, answered 404.
Google learns these addresses from links, and WordPress supplies one kind itself. A post carries its ?p= address in its <head>, as a shortlink, and sends it again in a Link header. www or non-www covers the host, and shows that WordPress does not send a page from http to https: where that redirect exists, the server or the host makes it. Changing permalinks covers which old addresses WordPress forwards after a change of structure.
To see what one address answers, follow it to its end:
curl -s -o /dev/null -L -D - https://example.com/summer-sale/ | grep -i -E "^(HTTP|location|x-redirect-by)"HTTP/1.1 301 Moved Permanently
X-Redirect-By: WordPress
Location: https://example.com/june-offer/
HTTP/1.1 200 OKEach hop prints its status, what sent it and where it leads. The last line is the page that answers. Without a terminal, the redirect checker shows each hop, its status code and where it leads.
If the list is longer than you can read by hand, WP Ministry's SEO audit looks at what each address answers with, redirects that chain or loop included.
What causes it
The redirect is doing its job
CommonWordPress forwards old and alternative forms of an address to the one page that should be indexed. Google lists the forwarded address here and can index the page it leads to. Nothing needs to change.
Your own pages link to an address that redirects
CommonA post was renamed or a page was moved, and links written before then still point at the old address. Each visitor and each crawler that follows one takes an extra step.
Fix: Point your own links at the final address, or Let Google see the change
A sitemap lists an address that redirects
SometimesA sitemap says which addresses a site wants shown in search results. WordPress's own sitemap lists current addresses. A file written by hand or by another tool goes on listing an old one until someone corrects it.
Fix: Take redirecting addresses out of the sitemap, or Let Google see the change
The address takes two or more redirects to arrive
SometimesA rule written for one move points at an address that has since moved again. The server forwards the request once and WordPress forwards it a second time.
Fix: Shorten a chain to one redirect, or Let Google see the change
A move meant for good answers 302
SometimesAn Apache Redirect line with no status, and WordPress's wp_redirect() with no status, both send 302. Google reads that as a temporary move and does not take it as a sign that the new address should replace the old one.
Fix: Change a 302 to a 301 where the move is for good, or Let Google see the change
The redirect leads to the wrong page
SometimesA rule sends many old addresses to the home page, or WordPress's guess for an address it cannot find picks a post whose slug begins the same way.
Fix: Read the whole list, and leave what is right, or Let Google see the change
A page you want indexed redirects
RareA rule in a redirect plugin, a plugin that asks visitors to log in, or a rule on the server sends visitors away from a page that should load.
Fix: Find what redirects a page that should load, or Let Google see the change
How to fix it
Read the whole list, and leave what is right
- Takes care
- No risk
- About 15 minutes
- Steps tested on WordPress 7.1.3
Step 1: Export the list
Open the status in the report and export its table of addresses, or copy them out. Put the addresses in a file named
redirects.txt, one to a line.Step 2: Ask every address where it ends
bashwhile read -r url; do first=$(curl -s -o /dev/null -w '%{http_code}' "$url") last=$(curl -s -o /dev/null -L -w '%{num_redirects} %{http_code} %{url_effective}' "$url") printf '%s %s %s\n' "$url" "$first" "$last" done < redirects.txtStep 3: Read each line
After the address come its first answer, the number of redirects curl followed, the last answer, and the address it ended at.
texthttps://example.com/?p=123 301 1 200 https://example.com/june-offer/ https://example.com/hello-world 301 1 200 https://example.com/hello-world/ https://example.com/sale/ 301 2 200 https://example.com/june-offer/ https://example.com/promo/ 302 1 200 https://example.com/june-offer/ https://example.com/services/web-design/ 301 1 200 https://example.com/
| The line shows | It means | What to do |
|---|---|---|
301 or 308, one redirect, 200, at the page that replaced the address | The redirect is right | Nothing |
| Two redirects or more | A chain | Shorten it, below |
302 or 307 first, on a move that is for good | A temporary redirect | Make it permanent, below |
| It ends at the home page, or at a page about something else | The wrong destination | See the next paragraph |
404 last | The redirect leads to a page that is gone | Point it at a page that exists, or remove it |
| The address is one you want in Google | It should not redirect | Find what sent it, below |
One form of the wrong destination is a rule that sends a whole section to the home page. Google's guide to moving a site says many old addresses sent to one irrelevant page "might be treated as a soft 404 error". WordPress can also choose the destination: asked for /hello, which no page has, this site answered 301 to /hello-world/, a guess from the start of a slug. Traffic dropped after a redesign runs both cases and has the cure, and the redirect map builder turns a list of old and new addresses into rules.
Take redirecting addresses out of the sitemap
- Easy
- Low risk
- About 10 minutes
- Steps tested on WordPress 7.1.3
Google's sitemap documentation says to include the addresses you want to see in its search results. An address that redirects is not one of them.
WordPress's own sitemap needs no attention. After the slug changed, the post's file listed the new address and not the old one:
curl -s https://example.com/wp-sitemap-posts-post-1.xml | grep -o '<loc>[^<]*</loc>'A sitemap file written by hand or by a tool outside WordPress is not updated when a slug changes. This asks for every address in one sitemap file and prints what each answers:
curl -s https://example.com/sitemap.xml | grep -o '<loc>[^<]*' | cut -c6- | while read -r url; do
printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$url")" "$url"
doneEvery line should begin 200. Where a line begins 301, replace that address with the one it leads to, in the file or in the settings of whatever made it. Give the command the address of a file that lists pages. An index, such as /wp-sitemap.xml, lists other sitemap files. The sitemap WordPress makes explains which sitemap a site serves.
To undo it: Put your copy of the old sitemap file back.
Point your own links at the final address
- Takes care
- Back up first
- About 20 minutes
- Steps tested on WordPress 7.1.3
Google's guide to moving a site says to change internal links from the old addresses to the new ones. The redirect stays for everyone else's links.
Step 1: Find where the old address is written
Each hit is printed under its table and column with the number of its row.
wp_posts:post_contentis the text of a post or page. A hit underwp_posts:guidis not a link. It is a post's permanent identifier, and WordPress's documentation says never to change it.bashwp db search 'https://example.com/summer-sale/'Step 2: See what a replacement would change
Write both addresses in full, with the final slash, so that
/summer-sale/does not also match/summer-sale-rules/.bashwp search-replace 'https://example.com/summer-sale/' 'https://example.com/june-offer/' --skip-columns=guid --report-changed-only --dry-runStep 3: Back up the database, then run it for real
The replacement cannot be taken back without a backup. Scheduling backups covers how to make one.
bashwp search-replace 'https://example.com/summer-sale/' 'https://example.com/june-offer/' --skip-columns=guid --report-changed-only
Without WP-CLI, open each post or menu that holds the link and correct it in the editor.
To undo it: Restore the database backup you took before the replacement.
Shorten a chain to one redirect
- Takes care
- Back up first
- About 15 minutes
- Steps tested on WordPress 7.1.3
Here .htaccess held Redirect 301 "/sale/" "/summer-sale/", written before the post was renamed. Asked for /sale/, the site answered twice:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/summer-sale/
HTTP/1.1 301 Moved Permanently
X-Redirect-By: WordPress
Location: https://example.com/june-offer/
HTTP/1.1 200 OKThe first hop has no X-Redirect-By line, so the server sent it. The second is WordPress forwarding the old slug.
Google's page on status codes says its crawlers "follow up to 10 redirect hops" by default. Its guide to moving a site advises redirecting to the final destination directly.
Change the rule's target to the address the chain ends at. The line belongs above # BEGIN WordPress.
Redirect 301 "/sale/" "/june-offer/"Asked again, /sale/ answers once and the next line is 200. How to set up redirects in WordPress covers rules kept in a plugin or in nginx.
To undo it: Put your copy of the old .htaccess back.
Change a 302 to a 301 where the move is for good
- Takes care
- Back up first
- About 10 minutes
- Steps tested on WordPress 7.1.3
Google's page on redirects says a permanent redirect is used as a signal that the target should be canonical, and that the target is shown in results. For a temporary one it says the redirect is not used as that signal and the source page is shown. So a 302 is right for a page that will come back, and wrong for a move that is for good.
Two ways to get a 302 without choosing one:
- A
Redirectline with no status. Apache's documentation says that with no status given the redirect is temporary, a 302.Redirect "/promo/" "/june-offer/"answeredHTTP/1.1 302 Found. wp_redirect()with no status. WordPress's code reference gives 302 as its default. A snippet that calls it with an address and nothing else answered 302, and with301as the second value it answered 301.
The first line the hop command prints shows which one an address sends. In .htaccess, write the status into the rule:
Redirect 301 "/promo/" "/june-offer/"WordPress's own 302s in the table, from /admin and /login, lead to pages that are not for search results. Leave them.
To undo it: Put your copy of the old .htaccess back.
Find what redirects a page that should load
- Takes care
- Low risk
- About 20 minutes
- Steps tested on WordPress 7.1.3
Run the hop command on the page that should load, and read the first hop.
| The first hop shows | Sent by | Look in |
|---|---|---|
X-Redirect-By with another name | The plugin that gave that name. WordPress lets a plugin name itself there | That plugin's list of redirects |
X-Redirect-By: WordPress, and Location is wp-login.php with redirect_to= | Something that requires a login for the page | A membership or privacy plugin's settings |
X-Redirect-By: WordPress, any other Location | WordPress, or code that did not name itself | The table above, then your plugins. Finding a plugin conflict has the method |
No X-Redirect-By line | Something other than WordPress's redirect function | .htaccess above # BEGIN WordPress first, then the host's and the CDN's redirect settings |
Each row was produced on a WordPress site: by a plugin that named itself, by code that called WordPress's login check, and by a Redirect line in .htaccess. With each one removed, the page answered 200 at once.
A site still showing a holding page is a different case. See coming soon pages and SEO.
To undo it: Put the rule back, or switch the plugin on again.
Let Google see the change
- Easy
- No risk
- About 10 minutes
A corrected sitemap, link or chain needs no request. Google's help says it updates the count whenever it crawls a page with a known issue, whether or not validation was requested.
Validate fix asks Google to confirm that a reason is gone from the addresses it listed. The help says to fix all of them first, because validation stops at "a single remaining instance", and that it typically takes up to about two weeks and sometimes much longer. An address that is meant to redirect is still an instance. On a list that is mostly correct redirects there is nothing to validate.
URL Inspection is for one address. For a page that redirected by mistake and now loads, inspect it and request indexing. The help says a request does not guarantee that the page will appear in the index. Two notes from the same help: the indexed result is for the address you typed, not for the redirect's target, and the live test follows a redirect without saying that it did.
When to get help
If the list holds pages that should be live, or it grew after a redesign and the old addresses do not lead where they should, the site needs a map of every old address, what it answers and where it ought to lead. A redirect added outside WordPress, at the host or at a CDN, takes access to those accounts to find.
Common questions
Is "Page with redirect" bad for my site?
Not by itself. Google's help lists it among reasons that are not necessarily errors. The address that redirects is left out of the index, which is what a redirect is for. The pages to care about are the ones the redirects lead to.
Should I delete old redirects to bring the number down?
No. Google's guide to moving a site says to keep redirects "for as long as possible, generally at least 1 year". An old address with its redirect removed answers 404 and moves to another reason in the same report.
Why does an address I redirected still show in Google?
Google's page on redirects says it keeps track of both addresses, and that the old one may appear in results as an alternate name when a search suggests the searcher trusts it more. If the redirect is a 302, the same page says the source is the one shown.
The page my redirect leads to is not indexed either. Why?
That is a separate question about that page. Inspect the target's own address in Search Console and read the reason given for it. WordPress site not showing up on Google has the checks in order.
- GuideBing Webmaster Tools for WordPress: setup, IndexNow, and what it means for ChatGPT and Copilot
- GuideBusiness not showing on Google Maps: what to check, in order
- GuideGenerative engine optimization (GEO): what is documented, what was studied and what is guesswork
- GuideGoogle Business Profile suspended: what it means, why it happens and how to appeal
- GuideHow long a new WordPress site takes to show up on Google, and what to do on day one
- GuideHow long does SEO take? The times Google states, and the ones it does not

