Most people treat wp 301 redirects as a plumbing job — install a plugin, paste an old URL and a new one, move on. That works until you have a few hundred of them, a migration that scrambles your permalink structure, or a redirect chain quietly bleeding link equity across three hops. Then the “plumbing” becomes the single most expensive mistake on the site. A redirect is not a cosmetic fix; it is an instruction to Google about which URL inherits the ranking history of another. Get the mechanism wrong and you don’t just break a link — you tell the algorithm to forget years of accumulated authority.
This guide covers where WordPress lets you place a 301, how to choose between plugin and server-level rules on purpose rather than by default, why loops and chains form, and a migration sequence that keeps rankings intact instead of gambling them.
What a 301 Actually Tells Google (and Why 302 Is Not a Shortcut)
A 301 is an HTTP status code meaning “moved permanently.” When Googlebot hits a 301, it does three things over time: drops the old URL from the index, transfers the ranking signals to the destination, and updates its canonical to the new address. A 302 (“found,” temporary) does none of that reliably — Google keeps the original URL indexed because you told it the move is temporary. The rule of thumb: if the old URL is never coming back, use a 301. Reserve 302 for genuinely temporary states like an A/B test or a seasonal landing page you’ll revert.
Two nuances matter. First, 301 equity transfer is near-complete today, but it is not instant — expect Google to fully consolidate signals over a few weeks to a couple of months, not overnight. Second, WordPress and some plugins can emit a 302 when you meant a 301. Always verify the actual status code with curl -I rather than trusting the plugin’s label. A mislabeled temporary redirect is one of the most common silent traffic killers on migrated sites.
The Three Places You Can Put WP 301 Redirects
WordPress gives you three implementation layers, and the choice is a real trade-off, not a matter of taste:
- Server config (Apache
.htaccessor an nginx server block) — fastest, no database queries, no PHP boot. The redirect resolves before WordPress even loads. - A redirect plugin (Redirection, Rank Math, Yoast Premium) — most accessible, gives editors a UI and logging, but every rule is a database lookup on a full WordPress request cycle.
- Custom PHP in a functions file or mu-plugin — most flexible for conditional logic, but you own the maintenance and the risk.
The decision rule I use after managing redirects across a portfolio: if a rule is permanent, high-traffic, or part of a bulk migration map, put it at the server level. If it’s a one-off an editor needs to create without a developer — a retired blog post pointing to its replacement — a plugin is the right call. Reach for custom PHP only when you need logic a static map can’t express, like redirecting based on a query parameter or user role.
The Built-In Behavior You Already Have
Before you install anything, know that WordPress already redirects in ways that surprise people. When you change a post’s slug, WordPress stores the old slug in post meta and issues an automatic 301 from the old URL to the new one. This is genuinely useful — and genuinely limited. It only covers slug changes on existing posts, it doesn’t survive if the post is deleted, and it does nothing for changed category bases, restructured permalinks, or pages moved between post types. Relying on it as your redirect strategy is how sites end up with hundreds of 404s after a “small” restructure.
WordPress also performs canonical redirects: it will force a trailing slash, lowercase a path, or redirect a bare domain to your configured Site URL. These are helpful until they collide with a server rule or a CDN setting doing the same job — which is exactly how loops are born.
Plugin Route: When It Is the Right Call
A plugin like Redirection is the correct tool when non-developers need to manage redirects, when you want hit logging to see which rules actually fire, or when the volume is modest — say, up to a few thousand rules on a site that isn’t under heavy load. The cost is real but bounded: each request that could match a redirect triggers a database lookup during WordPress initialization. On a low-traffic blog that’s invisible. On a high-traffic site with a bloated redirect table, it adds measurable latency to every 404 and every matched request.
If you already run Rank Math or Yoast Premium, use their built-in redirect manager rather than stacking a second plugin — two plugins both trying to handle the same URL is a classic loop source. Whatever you choose, keep the table clean: prune redirects pointing at pages that themselves now redirect, or you’ll build chains.
Server Route: For Migrations and Large Maps
When you’re migrating thousands of URLs or handling high traffic, move the rules to the server. A server-level redirect costs a few milliseconds and zero database queries because it resolves before PHP runs. In Apache you write Redirect 301 /old-path /new-path or a RewriteRule with regex for patterns; in nginx you use a return 301 inside a location block or a map for large sets. The regex power here is the point: one pattern rule can replace ten thousand individual plugin entries when you’re doing a structural change like /blog/2024/post to /post.
The trade-off is access. Server config typically needs FTP or SSH and a mistake can 500 the whole site, so test rules in a staging environment first and keep a backup of the original config file. This is not where an editor should be working unsupervised.
Redirect Chains and Loops: The Two Silent Failures
A chain is when URL A redirects to B, which redirects to C. Each hop adds latency, and while Google now follows chains and passes equity through them, long chains dilute crawl efficiency and occasionally get truncated. The fix is discipline: always redirect straight to the final destination. When you retire the page that was already a redirect target, update every rule pointing at it, don’t stack a new hop on top.
A loop is worse — A redirects to B and B redirects back to A, producing an ERR_TOO_MANY_REDIRECTS and a page nobody, including Googlebot, can reach. The usual causes are a mismatch between your WordPress Site URL and Home URL settings, a CDN or host forcing HTTPS while WordPress also forces it, or two plugins (or a plugin and a server rule) both claiming the same path. Diagnose loops by curling the URL and reading the Location header at each hop — the loop reveals itself in two lines.
A Worked Micro-Example: Restructuring a Blog
Say you’re moving every post from /blog/{slug} to /{slug} — a common flattening. Here’s the sequence that holds up. First, export the full list of live URLs before you touch anything (a crawl gives you the authoritative set). Second, change the permalink structure in WordPress. Third, add one regex server rule: in Apache, RewriteRule ^blog/(.*)$ /$1 [R=301,L]. That single line handles every post at once. Fourth, update internal links so they point directly at the new URLs — internal links should never rely on the redirect, because you’re spending crawl budget and latency on every click. Fifth, re-crawl and confirm every old URL returns a single 301 to the correct new URL with no chain. Skip the internal-link step and you’ve built a site where every navigation click bounces through a redirect — technically working, quietly slow, and a signal to Google that your architecture is messy.
Testing Every Rule You Add
The command-line check is non-negotiable: curl -I https://yoursite.com/old-url shows you the exact status code and the Location header the destination. You want to see HTTP/1.1 301 and a Location pointing straight at the final URL, then a 200 when you request that destination. Anything else — a 302, a chain, a 404 at the end — is a rule to fix.
At scale, spot-checking individual URLs with curl doesn’t cut it; you need to crawl the whole site and flag every redirect chain, loop, and 301 that lands on a 404. This is where a real crawler earns its keep. SEO Rocket’s site audit runs an actual crawler over your live URLs, surfaces redirect chains and broken destinations across the whole map, and lets you catch a botched migration before Google recrawls and starts dropping pages. Verifying a redirect map by hand on a thousand-page site is how mistakes ship.
How Redirects Fit the Bigger Ranking Picture
Redirects protect equity you’ve already earned — they don’t create new rankings. The mistake I see most often is treating a flawless redirect map as an SEO strategy rather than damage control during a change. The pages you redirect to still have to be worth ranking. If you’re consolidating three thin posts into one, the destination needs to actually satisfy the query better than any of the three did, or you’ve just merged three mediocre pages into one mediocre page with a cleaner URL.
That’s the workflow discipline behind the SEO Rocket playbook, proven across 1,000,000+ ranking pages: research the keyword and intent on real Ahrefs data, benchmark the weakest page-one competitor, publish content that clears validation gates, then track rankings through the change so you can tell a temporary migration dip from a real problem. A redirect keeps the door open; the content is what people walk in for.
Frequently Asked Questions About WP 301 Redirects
Do WordPress 301 redirects pass all the SEO value?
Effectively yes — Google has confirmed that 301s pass full ranking signals, so you won’t lose PageRank purely from the redirect itself. The caveat is time and relevance: consolidation takes weeks to fully register, and redirecting to an irrelevant page (like sending every dead URL to the homepage) can be treated as a soft 404, which passes nothing. Redirect to the closest real equivalent.
Should I use a plugin or edit .htaccess for wp 301 redirects?
Use a plugin for a handful of editor-managed, one-off redirects and for hit logging. Move to server-level rules (.htaccess or nginx) for migrations, pattern-based bulk maps, and high-traffic sites where the per-request database lookup of a plugin adds up. Many sites run both: server rules for structural redirects, a plugin for the long tail of retired posts.
Why does my WordPress redirect cause a loop?
Loops almost always come from two systems fighting over the same URL: a mismatched Site URL and Home URL, a host or CDN forcing HTTPS while WordPress also forces it, or two plugins handling the same path. Curl the URL, follow the Location header hop by hop, and you’ll see exactly where A points back to B. Remove the duplicate rule rather than adding a third.
How long should I keep old redirects in place?
Keep them permanently if the old URLs still receive traffic or hold backlinks. There’s no expiry on a 301 — pull one only when you’ve confirmed nothing links to the old URL and it gets no traffic. On a big migration, plan to keep the redirect map live for at least a year, then audit before removing anything.
The Bottom Line
Handled well, wp 301 redirects are invisible: users and Google land where they should, and years of ranking history survive a URL change. Handled carelessly, they’re the fastest way to turn a routine restructure into a traffic cliff. Choose the layer on purpose — server for scale and patterns, plugin for editor-managed one-offs — redirect straight to the final destination every time, verify with curl and a full-site crawl, and never mistake a clean redirect map for content worth ranking. The redirect protects what you built; it’s still on you to have built something worth protecting.