{"id":4764,"date":"2026-06-16T18:27:41","date_gmt":"2026-06-16T18:27:41","guid":{"rendered":"https:\/\/www.copahost.com\/blog\/?p=4764"},"modified":"2026-06-16T19:19:47","modified_gmt":"2026-06-16T19:19:47","slug":"http-301","status":"publish","type":"post","link":"https:\/\/www.copahost.com\/blog\/http-301\/","title":{"rendered":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">You change a URL, move to a new domain, or finally switch your site to HTTPS \u2014 and you need every visitor, every bookmark, and every search engine to land on the new address without losing the traffic and rankings you&#8217;ve built. That&#8217;s the job of the <strong>HTTP 301<\/strong>. Used correctly, it&#8217;s the single most important redirect for SEO. Used carelessly, it&#8217;s almost impossible to undo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers HTTP 301 from every angle: what it actually means, the different labels you&#8217;ll see it under, how it compares to 302, 307, and 308, why it&#8217;s so central to SEO, the mistakes that quietly cost rankings, and exactly how to set one up on Apache, Nginx, PHP, and WordPress.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Quick answer:<\/strong> HTTP 301 means <strong>&#8220;Moved Permanently.&#8221;<\/strong> It tells browsers and search engines that a URL has moved to a new address <em>for good<\/em> \u2014 update your records, send everyone to the new URL, and transfer the old page&#8217;s ranking signals to it. Unlike a temporary <a href=\"https:\/\/www.copahost.com\/blog\/http-302\/\">302 redirect<\/a>, the original URL is not expected to come back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><div id=\"ez-toc-container\" class=\"ez-toc-v2_0_69_1 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#What_HTTP_301_actually_means\" title=\"What HTTP 301 actually means\">What HTTP 301 actually means<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#Why_the_301_matters_so_much_for_SEO\" title=\"Why the 301 matters so much for SEO\">Why the 301 matters so much for SEO<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#301_vs_302_307_and_308\" title=\"301 vs 302, 307, and 308\">301 vs 302, 307, and 308<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#The_variations_every_way_youll_see_a_301\" title=\"The variations: every way you&#8217;ll see a 301\">The variations: every way you&#8217;ll see a 301<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#When_to_use_a_301\" title=\"When to use a 301\">When to use a 301<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#When_NOT_to_use_a_301_common_mistakes\" title=\"When NOT to use a 301 (common mistakes)\">When NOT to use a 301 (common mistakes)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#How_to_set_up_a_301_correctly\" title=\"How to set up a 301 correctly\">How to set up a 301 correctly<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#How_to_reverse_a_301_or_switch_a_302_to_a_301\" title=\"How to reverse a 301 (or switch a 302 to a 301)\">How to reverse a 301 (or switch a 302 to a 301)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#How_to_verify_a_301\" title=\"How to verify a 301\">How to verify a 301<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#Best-practice_checklist\" title=\"Best-practice checklist\">Best-practice checklist<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/#Conclusion\" title=\"Conclusion\">Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_HTTP_301_actually_means\"><\/span>What HTTP 301 actually means<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">301 belongs to the <strong>3xx family<\/strong> of HTTP status codes, which all handle redirection. Its name is <strong>&#8220;Moved Permanently,&#8221;<\/strong> and it signals that the requested resource now lives permanently at a different URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The mechanics are simple. When a browser requests the old URL, the server responds with a 301 status and a <code>Location<\/code> header pointing to the new address:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-keyword\">GET<\/span> <span class=\"hljs-string\">\/old-page<\/span> HTTP\/1.1\n<span class=\"hljs-attribute\">Host<\/span>: example.com\n\nHTTP\/1.1 301 Moved Permanently\nLocation: https:\/\/example.com\/new-page<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div style=\"border:1px solid #E2E8F0;border-radius:12px;padding:18px;margin:24px 0;background:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"text-align:center;font-weight:700;font-size:15px;color:#475569;letter-spacing:.03em;text-transform:uppercase;margin-bottom:8px;\">How a 301 redirect works<\/div>\n  <svg viewBox=\"0 0 700 320\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"Sequence: browser requests the old URL, server replies 301 Moved Permanently with a Location header, browser requests the new URL and gets 200 OK, and the browser caches the redirect\">\n    <defs>\n      <marker id=\"r3\" markerWidth=\"10\" markerHeight=\"10\" refX=\"7\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L7,3 L0,6 Z\" fill=\"#334155\"\/><\/marker>\n      <marker id=\"l3\" markerWidth=\"10\" markerHeight=\"10\" refX=\"2\" refY=\"3\" orient=\"auto\"><path d=\"M7,0 L0,3 L7,6 Z\" fill=\"#334155\"\/><\/marker>\n      <marker id=\"lg3\" markerWidth=\"10\" markerHeight=\"10\" refX=\"2\" refY=\"3\" orient=\"auto\"><path d=\"M7,0 L0,3 L7,6 Z\" fill=\"#16A34A\"\/><\/marker>\n    <\/defs>\n    <rect x=\"60\" y=\"18\" width=\"150\" height=\"40\" rx=\"9\" fill=\"#EFF6FF\" stroke=\"#2563EB\" stroke-width=\"1.5\"\/>\n    <text x=\"135\" y=\"43\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#1E40AF\">Browser<\/text>\n    <rect x=\"490\" y=\"18\" width=\"150\" height=\"40\" rx=\"9\" fill=\"#F5F3FF\" stroke=\"#7C3AED\" stroke-width=\"1.5\"\/>\n    <text x=\"565\" y=\"43\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#6D28D9\">Server<\/text>\n    <line x1=\"135\" y1=\"58\" x2=\"135\" y2=\"300\" stroke=\"#CBD5E1\" stroke-width=\"2\" stroke-dasharray=\"4 4\"\/>\n    <line x1=\"565\" y1=\"58\" x2=\"565\" y2=\"300\" stroke=\"#CBD5E1\" stroke-width=\"2\" stroke-dasharray=\"4 4\"\/>\n    <line x1=\"135\" y1=\"90\" x2=\"565\" y2=\"90\" stroke=\"#334155\" stroke-width=\"2\" marker-end=\"url(#r3)\"\/>\n    <text x=\"350\" y=\"83\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"600\" fill=\"#334155\">1 \u00b7 GET \/old-page<\/text>\n    <line x1=\"565\" y1=\"138\" x2=\"135\" y2=\"138\" stroke=\"#DC2626\" stroke-width=\"2.5\" marker-end=\"url(#l3)\"\/>\n    <text x=\"350\" y=\"124\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"700\" fill=\"#B91C1C\">2 \u00b7 301 Moved Permanently<\/text>\n    <text x=\"350\" y=\"155\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#7F1D1D\">Location: \/new-page<\/text>\n    <text x=\"135\" y=\"182\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"#94A3B8\">(browser caches &amp; remembers)<\/text>\n    <line x1=\"135\" y1=\"208\" x2=\"565\" y2=\"208\" stroke=\"#334155\" stroke-width=\"2\" marker-end=\"url(#r3)\"\/>\n    <text x=\"350\" y=\"201\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"600\" fill=\"#334155\">3 \u00b7 GET \/new-page<\/text>\n    <line x1=\"565\" y1=\"252\" x2=\"135\" y2=\"252\" stroke=\"#16A34A\" stroke-width=\"2.5\" marker-end=\"url(#lg3)\"\/>\n    <text x=\"350\" y=\"245\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"700\" fill=\"#15803D\">4 \u00b7 200 OK \u2014 page loads<\/text>\n    <rect x=\"140\" y=\"278\" width=\"420\" height=\"30\" rx=\"8\" fill=\"#FEF2F2\" stroke=\"#FECACA\" stroke-width=\"1\"\/>\n    <text x=\"350\" y=\"298\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"600\" fill=\"#B91C1C\">\/new-page becomes canonical \u2014 the old URL won&#8217;t come back<\/text>\n  <\/svg>\n<\/div>\n\n\n\n<div role=\"alert\" style=\"display:flex;gap:14px;align-items:flex-start;background:#FEF2F2;border:1px solid #FECACA;border-left:4px solid #DC2626;border-radius:10px;padding:16px 18px;margin:20px 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#5B1A1A;line-height:1.55;\">\n  <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"flex:0 0 auto;margin-top:1px;\" aria-hidden=\"true\">\n    <path d=\"M12 3L2 20h20L12 3z\" stroke=\"#DC2626\" stroke-width=\"2\" stroke-linejoin=\"round\"\/>\n    <path d=\"M12 10v4M12 17v.5\" stroke=\"#DC2626\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n  <\/svg>\n  <div>\n    <strong style=\"display:block;font-size:14px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:#B91C1C;margin-bottom:4px;\">Before you use a 301<\/strong>\n    <span style=\"font-size:15.5px;\">A 301 is cached aggressively by browsers \u2014 reversing one means waiting out the cache or asking users to clear it. Be certain the move is permanent before using one.<\/span>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The browser reads the <code>Location<\/code> header and <strong>automatically requests the new URL<\/strong>, landing the visitor on the right page. But a 301 does something a temporary redirect doesn&#8217;t: because the move is permanent, <strong>the browser caches it and remembers it<\/strong>, going straight to the new URL on future visits without even asking the server. Search engines do the equivalent \u2014 they update their index to the new URL and treat it as the canonical address.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That permanence is the whole point, and it cuts both ways: it&#8217;s exactly what makes a 301 powerful for SEO, and exactly what makes it hard to reverse once it&#8217;s out in the wild.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A bit of history rounds out the picture. The 301 has been part of HTTP since the very beginning \u2014 it was defined in <strong>HTTP\/1.0 (RFC 1945, 1996)<\/strong>, carried forward in <strong>HTTP\/1.1 (RFC 2616, 1999)<\/strong>, and is documented today in the current specification, <strong>RFC 9110 (2022)<\/strong>. One wrinkle followed it the whole way: the spec said a 301 should preserve the request method, but older clients often switched a POST to a GET anyway. To remove that ambiguity, <strong>308 Permanent Redirect<\/strong> was later introduced as a stricter 301 that guarantees the method and body are preserved \u2014 which is why, decades on, both codes still exist side by side.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Why_the_301_matters_so_much_for_SEO\"><\/span>Why the 301 matters so much for SEO<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you only remember one thing about the 301, make it this: <strong>a 301 passes the old page&#8217;s ranking signals \u2014 its &#8220;link equity&#8221; \u2014 to the new URL.<\/strong> When other sites link to your old address, a 301 funnels that authority to the new one, so you keep the rankings you earned instead of starting over.<\/p>\n\n\n\n<div style=\"border:1px solid #E2E8F0;border-radius:12px;padding:18px;margin:24px 0;background:#F8FAFC;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"text-align:center;font-weight:700;font-size:15px;color:#475569;letter-spacing:.03em;text-transform:uppercase;margin-bottom:8px;\">A 301 transfers SEO value to the new URL<\/div>\n  <svg viewBox=\"0 0 700 220\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"Backlinks point at the old URL, a 301 redirect passes close to 100 percent of link equity to the new URL\">\n    <defs>\n      <marker id=\"eq\" markerWidth=\"11\" markerHeight=\"11\" refX=\"7\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L7,3 L0,6 Z\" fill=\"#16A34A\"\/><\/marker>\n      <marker id=\"bl\" markerWidth=\"9\" markerHeight=\"9\" refX=\"6\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L6,3 L0,6 Z\" fill=\"#94A3B8\"\/><\/marker>\n    <\/defs>\n    <text x=\"70\" y=\"42\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#64748B\">Backlinks<\/text>\n    <rect x=\"20\" y=\"55\" width=\"100\" height=\"26\" rx=\"6\" fill=\"#fff\" stroke=\"#CBD5E1\"\/><text x=\"70\" y=\"72\" text-anchor=\"middle\" font-size=\"11\" fill=\"#475569\">site-a.com<\/text>\n    <rect x=\"20\" y=\"90\" width=\"100\" height=\"26\" rx=\"6\" fill=\"#fff\" stroke=\"#CBD5E1\"\/><text x=\"70\" y=\"107\" text-anchor=\"middle\" font-size=\"11\" fill=\"#475569\">site-b.com<\/text>\n    <rect x=\"20\" y=\"125\" width=\"100\" height=\"26\" rx=\"6\" fill=\"#fff\" stroke=\"#CBD5E1\"\/><text x=\"70\" y=\"142\" text-anchor=\"middle\" font-size=\"11\" fill=\"#475569\">site-c.com<\/text>\n    <rect x=\"210\" y=\"78\" width=\"150\" height=\"50\" rx=\"10\" fill=\"#FEF2F2\" stroke=\"#DC2626\" stroke-width=\"1.5\"\/>\n    <text x=\"285\" y=\"100\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"700\" fill=\"#B91C1C\">Old URL<\/text>\n    <text x=\"285\" y=\"117\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"#7F1D1D\">\/old-page<\/text>\n    <line x1=\"120\" y1=\"68\" x2=\"208\" y2=\"92\" stroke=\"#94A3B8\" stroke-width=\"1.5\" marker-end=\"url(#bl)\"\/>\n    <line x1=\"120\" y1=\"103\" x2=\"208\" y2=\"103\" stroke=\"#94A3B8\" stroke-width=\"1.5\" marker-end=\"url(#bl)\"\/>\n    <line x1=\"120\" y1=\"138\" x2=\"208\" y2=\"114\" stroke=\"#94A3B8\" stroke-width=\"1.5\" marker-end=\"url(#bl)\"\/>\n    <line x1=\"360\" y1=\"103\" x2=\"468\" y2=\"103\" stroke=\"#16A34A\" stroke-width=\"3\" marker-end=\"url(#eq)\"\/>\n    <text x=\"414\" y=\"94\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"800\" fill=\"#15803D\">301<\/text>\n    <text x=\"414\" y=\"120\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"#15803D\">~99% equity<\/text>\n    <rect x=\"470\" y=\"78\" width=\"160\" height=\"50\" rx=\"10\" fill=\"#F0FDF4\" stroke=\"#16A34A\" stroke-width=\"1.5\"\/>\n    <text x=\"550\" y=\"100\" text-anchor=\"middle\" font-size=\"12.5\" font-weight=\"700\" fill=\"#15803D\">New URL<\/text>\n    <text x=\"550\" y=\"117\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"#166534\">\/new-page (inherits ranking)<\/text>\n    <text x=\"350\" y=\"185\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#64748B\">Backlinks to the old URL keep their ranking power \u2014 passed to the new URL in a single hop.<\/text>\n  <\/svg>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A few specifics worth getting right:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>How much equity transfers?<\/strong> Close to all of it. Google has confirmed that a 301 passes essentially full PageRank to the destination. The old belief that redirects cost &#8220;about 15%&#8221; of link equity has been <strong>publicly retired<\/strong> by Google \u2014 for a single, direct 301, the loss is negligible.<\/li>\n\n\n\n<li><strong>The chain caveat.<\/strong> That &#8220;near-100%&#8221; assumes a <strong>single hop<\/strong>. Every extra step in a chain (A \u2192 B \u2192 C) adds latency and can erode signals, so always redirect straight from the old URL to the final one.<\/li>\n\n\n\n<li><strong>It&#8217;s not instant.<\/strong> Search engines need to recrawl the old URL to register the move, so rankings transfer over days or weeks, not minutes. A temporary dip during a migration is normal.<\/li>\n\n\n\n<li><strong>Don&#8217;t rely on redirects alone.<\/strong> Update your internal links to point directly at the new URLs, and submit an updated sitemap so search engines discover the changes faster.<\/li>\n<\/ul>\n\n\n\n<div role=\"note\" style=\"display:flex;gap:14px;align-items:flex-start;background:#EFF6FF;border:1px solid #BFDBFE;border-left:4px solid #2563EB;border-radius:10px;padding:16px 18px;margin:20px 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E3A5F;line-height:1.55;\">\n  <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"flex:0 0 auto;margin-top:1px;\" aria-hidden=\"true\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#2563EB\" stroke-width=\"2\"\/>\n    <path d=\"M12 11v5M12 7.5v.5\" stroke=\"#2563EB\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n  <\/svg>\n  <div>\n    <strong style=\"display:block;font-size:14px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:#1D4ED8;margin-bottom:4px;\">SEO tip<\/strong>\n    <span style=\"font-size:15.5px;\">Google passes ~99% of link equity through a single 301 \u2014 but only on a single hop. Every extra redirect in a chain erodes that, so always point the old URL straight to the final destination.<\/span>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This is also why using a 302 (temporary) for a permanent move is the <strong>single most common technical SEO mistake<\/strong> in site migrations: the destination URL never inherits the authority, the old URL eventually drops, and both underperform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"301_vs_302_307_and_308\"><\/span>301 vs 302, 307, and 308<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The 301 only makes sense next to its siblings. The two axes that matter are <strong>permanent vs temporary<\/strong> and <strong>whether the HTTP method is preserved<\/strong> (does a POST stay a POST?).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>301 Moved Permanently<\/strong> \u2014 permanent. The standard choice for a permanent move. Historically, some older clients switched POST to GET on a 301.<\/li>\n\n\n\n<li><strong>302 Found<\/strong> \u2014 temporary. The original URL stays canonical; use it only for genuine short-term detours. (See our full <a href=\"https:\/\/www.copahost.com\/blog\/http-302\/\">HTTP 302 guide<\/a>.)<\/li>\n\n\n\n<li><strong>307 Temporary Redirect<\/strong> \u2014 temporary, but <strong>guarantees the method is preserved<\/strong> (a POST stays a POST).<\/li>\n\n\n\n<li><strong>308 Permanent Redirect<\/strong> \u2014 the modern, strict version of the 301: permanent <strong>and<\/strong> method-preserving. Google treats it like a 301 for ranking purposes. Use it when a permanent redirect must keep the original HTTP method (APIs, form submissions, login flows).<\/li>\n<\/ul>\n\n\n\n<div style=\"margin:24px 0;overflow-x:auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"font-weight:700;font-size:15px;color:#0F172A;margin-bottom:8px;\">301 vs 302 vs 307 vs 308<\/div>\n  <table style=\"width:100%;border-collapse:separate;border-spacing:0;font-size:14px;border:1px solid #E2E8F0;border-radius:12px;overflow:hidden;min-width:620px;\">\n    <thead><tr style=\"background:#1E3A8A;color:#fff;text-align:left;\">\n      <th style=\"padding:12px 14px;\">Code<\/th><th style=\"padding:12px 14px;\">Type<\/th><th style=\"padding:12px 14px;\">Method kept?<\/th><th style=\"padding:12px 14px;\">Passes SEO value?<\/th><th style=\"padding:12px 14px;\">Use for<\/th>\n    <\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#F0FDF4;\"><td style=\"padding:11px 14px;border-bottom:1px solid #DCFCE7;border-left:4px solid #16A34A;font-weight:800;color:#15803D;\">301<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #DCFCE7;\"><span style=\"background:#FEE2E2;color:#B91C1C;font-size:11.5px;font-weight:700;padding:2px 8px;border-radius:999px;\">Permanent<\/span><\/td><td style=\"padding:11px 14px;border-bottom:1px solid #DCFCE7;color:#C2410C;\">\u2717 may \u2192 GET<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #DCFCE7;color:#15803D;font-weight:700;\">\u2713 yes (~99%)<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #DCFCE7;color:#334155;\">Permanent moves, migrations, HTTPS<\/td><\/tr>\n      <tr><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;border-left:4px solid #2563EB;font-weight:700;color:#1D4ED8;\">302<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;\"><span style=\"background:#DBEAFE;color:#1D4ED8;font-size:11.5px;font-weight:700;padding:2px 8px;border-radius:999px;\">Temporary<\/span><\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#C2410C;\">\u2717 may \u2192 GET<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#64748B;\">Stays on original<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#334155;\">Temporary detours, A\/B tests<\/td><\/tr>\n      <tr><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;border-left:4px solid #2563EB;font-weight:700;color:#1D4ED8;\">307<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;\"><span style=\"background:#DBEAFE;color:#1D4ED8;font-size:11.5px;font-weight:700;padding:2px 8px;border-radius:999px;\">Temporary<\/span><\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#15803D;font-weight:700;\">\u2713 yes<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#64748B;\">Stays on original<\/td><td style=\"padding:11px 14px;border-bottom:1px solid #EEF2F7;color:#334155;\">Temp move, POST\/PUT must survive<\/td><\/tr>\n      <tr><td style=\"padding:11px 14px;border-left:4px solid #16A34A;font-weight:700;color:#15803D;\">308<\/td><td style=\"padding:11px 14px;\"><span style=\"background:#FEE2E2;color:#B91C1C;font-size:11.5px;font-weight:700;padding:2px 8px;border-radius:999px;\">Permanent<\/span><\/td><td style=\"padding:11px 14px;color:#15803D;font-weight:700;\">\u2713 yes<\/td><td style=\"padding:11px 14px;color:#15803D;font-weight:700;\">\u2713 yes<\/td><td style=\"padding:11px 14px;color:#334155;\">Permanent move + keep method (APIs, forms)<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For the overwhelming majority of cases \u2014 changing a page&#8217;s URL, moving domains, switching to HTTPS \u2014 <strong>301 is the correct choice.<\/strong> Reach for 308 only when preserving the request method genuinely matters. The choice between the two permanent-vs-temporary options trips up most people, so we broke it down in full in our <a href=\"https:\/\/www.copahost.com\/blog\/301-vs-302-redirect\/\">301 vs 302 redirect guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_variations_every_way_youll_see_a_301\"><\/span>The variations: every way you&#8217;ll see a 301<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Like other status codes, the 301 appears under several labels depending on the server, the HTTP version, and the tool you&#8217;re using. They all mean the same thing \u2014 a permanent redirect \u2014 but recognizing each saves confusion.<\/p>\n\n\n\n<div style=\"margin:24px 0;overflow-x:auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"font-weight:700;font-size:15px;color:#0F172A;margin-bottom:8px;\">Every way you&#8217;ll see a 301<\/div>\n  <table style=\"width:100%;border-collapse:separate;border-spacing:0;font-size:14px;border:1px solid #E2E8F0;border-radius:12px;overflow:hidden;min-width:560px;\">\n    <thead><tr style=\"background:#16A34A;color:#fff;text-align:left;\">\n      <th style=\"padding:12px 14px;\">Label<\/th><th style=\"padding:12px 14px;\">Where you&#8217;ll see it<\/th><th style=\"padding:12px 14px;\">Meaning<\/th>\n    <\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#F0FDF4;\"><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700;color:#15803D;\">301 Moved Permanently<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#334155;\">Modern servers, RFC 9110, MDN<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#475569;\">Current official phrase<\/td><\/tr>\n      <tr><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700;color:#15803D;\">Moved Permanently<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#334155;\">Logs and some tools (no number)<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#475569;\">Same code, reason phrase only<\/td><\/tr>\n      <tr style=\"background:#F0FDF4;\"><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700;color:#15803D;\">301 \/ Permanent Redirect<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#334155;\">Dashboards, SEO tools<\/td><td style=\"padding:10px 14px;border-bottom:1px solid #DCFCE7;color:#B45309;font-weight:600;\">&#8220;Permanent Redirect&#8221; is also 308 \u2014 confirm which<\/td><\/tr>\n      <tr><td style=\"padding:10px 14px;font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700;color:#15803D;\">HTTP 301 \/ 301 redirect<\/td><td style=\"padding:10px 14px;color:#334155;\">Analytics, audits, conversation<\/td><td style=\"padding:10px 14px;color:#475569;\">Colloquial shorthand<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A quick contrast so you don&#8217;t confuse neighbors: <strong>301<\/strong> is permanent, while a <strong><a href=\"https:\/\/www.copahost.com\/blog\/http-302\/\">&#8220;Moved Temporarily&#8221; \/ &#8220;302 Found&#8221;<\/a><\/strong> label means the <em>temporary<\/em> sibling \u2014 a different code with very different SEO behavior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"When_to_use_a_301\"><\/span>When to use a 301<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A 301 is the right tool whenever a change is permanent. The most common cases:<\/p>\n\n\n\n<div style=\"margin:24px 0;overflow-x:auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"font-weight:700;font-size:15px;color:#0F172A;margin-bottom:8px;\">When a 301 is the right tool<\/div>\n  <table style=\"width:100%;border-collapse:separate;border-spacing:0;font-size:14.5px;border:1px solid #E2E8F0;border-radius:12px;overflow:hidden;min-width:520px;\">\n    <thead><tr style=\"background:#0F766E;color:#fff;text-align:left;\">\n      <th style=\"padding:12px 16px;\">Situation<\/th><th style=\"padding:12px 16px;\">Example<\/th>\n    <\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#F0FDFA;\"><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;font-weight:600;color:#0F172A;\">Changing domains<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">old-domain.com \u2192 new-domain.com<\/td><\/tr>\n      <tr><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;font-weight:600;color:#0F172A;\">Switching to HTTPS<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">http:\/\/ \u2192 https:\/\/<\/td><\/tr>\n      <tr style=\"background:#F0FDFA;\"><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;font-weight:600;color:#0F172A;\">Canonicalizing www<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">www.example.com \u2192 example.com<\/td><\/tr>\n      <tr><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;font-weight:600;color:#0F172A;\">Restructuring URLs<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">\/blog\/?p=123 \u2192 \/blog\/my-post<\/td><\/tr>\n      <tr style=\"background:#F0FDFA;\"><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;font-weight:600;color:#0F172A;\">Consolidating pages<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">Merge two similar posts into one<\/td><\/tr>\n      <tr><td style=\"padding:11px 16px;font-weight:600;color:#0F172A;\">Retiring a page<\/td><td style=\"padding:11px 16px;color:#475569;\">Point to the closest relevant page (not the homepage)<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The common thread: in every case, the old URL is <strong>gone for good<\/strong> and you want its authority to move with it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"When_NOT_to_use_a_301_common_mistakes\"><\/span>When NOT to use a 301 (common mistakes)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<div style=\"margin:24px 0;overflow-x:auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"font-weight:700;font-size:15px;color:#0F172A;margin-bottom:8px;\">Common 301 mistakes \u2014 and what to do instead<\/div>\n  <table style=\"width:100%;border-collapse:separate;border-spacing:0;font-size:14.5px;border:1px solid #E2E8F0;border-radius:12px;overflow:hidden;min-width:560px;\">\n    <thead><tr style=\"background:#B91C1C;color:#fff;text-align:left;\">\n      <th style=\"padding:12px 16px;\">\u2717 Mistake<\/th><th style=\"padding:12px 16px;\">\u2713 Do this instead<\/th>\n    <\/tr><\/thead>\n    <tbody>\n      <tr><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;border-left:4px solid #DC2626;color:#334155;\"><strong>Using a 301 for a temporary change<\/strong> (maintenance, A\/B tests, seasonal pages)<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">Use a <a href=\"https:\/\/www.copahost.com\/blog\/http-302\/\" style=\"color:#2563EB;\">302<\/a> \u2014 a 301 is hard to undo because browsers cache it<\/td><\/tr>\n      <tr style=\"background:#FafafA;\"><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;border-left:4px solid #DC2626;color:#334155;\"><strong>Redirect chains<\/strong> (A \u2192 B \u2192 C)<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">Flatten every chain to a single source-to-final hop<\/td><\/tr>\n      <tr><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;border-left:4px solid #DC2626;color:#334155;\"><strong>Redirect loops<\/strong> (often an HTTP\/HTTPS or www conflict)<\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">Ensure only one rule controls each redirect; avoids ERR_TOO_MANY_REDIRECTS<\/td><\/tr>\n      <tr style=\"background:#FafafA;\"><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;border-left:4px solid #DC2626;color:#334155;\"><strong>Redirecting everything to the homepage<\/strong><\/td><td style=\"padding:11px 16px;border-bottom:1px solid #EEF2F7;color:#475569;\">Redirect to the most relevant page \u2014 mass-to-home is treated as a <a href=\"https:\/\/www.copahost.com\/blog\/404-error-code\/\" style=\"color:#2563EB;\">soft 404<\/a><\/td><\/tr>\n      <tr><td style=\"padding:11px 16px;border-left:4px solid #DC2626;color:#334155;\"><strong>Forgetting internal links<\/strong><\/td><td style=\"padding:11px 16px;color:#475569;\">Update internal links to point directly at the new URLs<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_to_set_up_a_301_correctly\"><\/span>How to set up a 301 correctly<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Server-side redirects are the gold standard \u2014 they&#8217;re faster and more reliable than meta-refresh or JavaScript redirects, and search engines handle them best. Here&#8217;s how to issue a clean 301 across common stacks. (For a broader walkthrough, see our guide to <a href=\"https:\/\/www.copahost.com\/blog\/how-to-redirect-a-url-to-another-url\/\">URL redirection methods<\/a>.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apache (<code>.htaccess<\/code>)<\/strong> \u2014 a single redirect, plus the two most common site-wide rules:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Single page<\/span>\nRedirect <span class=\"hljs-number\">301<\/span> \/old-page \/<span class=\"hljs-keyword\">new<\/span>-page\n\n<span class=\"hljs-comment\"># Force HTTPS<\/span>\nRewriteEngine On\nRewriteCond %{HTTPS} off\nRewriteRule ^(.*)$ https:<span class=\"hljs-comment\">\/\/%{HTTP_HOST}%{REQUEST_URI} &#091;L,R=301]<\/span>\n\n<span class=\"hljs-comment\"># Force non-www (www \u2192 root domain)<\/span>\nRewriteCond %{HTTP_HOST} ^www\\.(.*)$ &#091;NC]\nRewriteRule ^(.*)$ https:<span class=\"hljs-comment\">\/\/%1\/$1 &#091;L,R=301]<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/htaccess-301-redirect-https-1024x683.png\" alt=\"Apache .htaccess file with a 301 redirect rule forcing HTTPS\" class=\"wp-image-4768\" srcset=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/htaccess-301-redirect-https-1024x683.png 1024w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/htaccess-301-redirect-https-300x200.png 300w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/htaccess-301-redirect-https-768x512.png 768w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/htaccess-301-redirect-https.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nginx:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Single page<\/span>\nlocation = \/old-page {\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">301<\/span> \/<span class=\"hljs-keyword\">new<\/span>-page;\n}\n\n<span class=\"hljs-comment\"># Force HTTPS for the whole server block<\/span>\nserver {\n    listen <span class=\"hljs-number\">80<\/span>;\n    server_name example.com www.example.com;\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">301<\/span> https:<span class=\"hljs-comment\">\/\/example.com$request_uri;<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>PHP:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">header( <span class=\"hljs-string\">'HTTP\/1.1 301 Moved Permanently'<\/span> );\nheader( <span class=\"hljs-string\">'Location: https:\/\/example.com\/new-page'<\/span> );\n<span class=\"hljs-keyword\">exit<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>WordPress<\/strong> \u2014 the simplest route is a plugin like <strong>Redirection<\/strong> or <strong>Rank Math\/Yoast<\/strong> redirect managers, which write 301s without touching files. In code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">wp_redirect( <span class=\"hljs-string\">'https:\/\/example.com\/new-page'<\/span>, <span class=\"hljs-number\">301<\/span> );\n<span class=\"hljs-keyword\">exit<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">One trap catches developers working in code: <strong>many frameworks default to a 302 if you don&#8217;t specify the status.<\/strong> In Express, <code>res.redirect('\/new-page')<\/code> sends a 302 \u2014 you have to write <code>res.redirect(301, '\/new-page')<\/code> to make it permanent. The same applies across most stacks (Node&#8217;s <code>http<\/code>, Laravel, Django, Rails helpers): the &#8220;redirect&#8221; shortcut is often temporary unless you pass the code explicitly. When the move is permanent, always state the <strong>301<\/strong> \u2014 an accidental 302 is the most common way a permanent redirect silently fails to pass its SEO value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After a domain change, also remember that DNS needs to point to the right place \u2014 and changes take time to <a href=\"https:\/\/www.copahost.com\/blog\/dns-propagation\/\">propagate across the internet<\/a> before everyone sees the new site.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_to_reverse_a_301_or_switch_a_302_to_a_301\"><\/span>How to reverse a 301 (or switch a 302 to a 301)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because browsers cache a 301 so aggressively, changing your mind later is the hard part. The steps depend on which direction <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">you&#8217;re going:<\/p>\n\n\n\n<div role=\"note\" style=\"display:flex;gap:14px;align-items:flex-start;background:#F0FDF4;border:1px solid #BBF7D0;border-left:4px solid #16A34A;border-radius:10px;padding:16px 18px;margin:20px 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#14532D;line-height:1.55;\">\n  <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"flex:0 0 auto;margin-top:1px;\" aria-hidden=\"true\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#16A34A\" stroke-width=\"2\"><\/circle>\n    <path d=\"M8 12.5l2.5 2.5L16 9.5\" stroke=\"#16A34A\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n  <\/svg>\n  <div>\n    <strong style=\"display:block;font-size:14px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:#15803D;margin-bottom:4px;\">Switching a 302 to a 301 \u2014 the easy direction<\/strong>\n    <span style=\"font-size:15.5px;\">If you used a temporary redirect for what&#8217;s actually a permanent move, just change the status code in your server rule. Search engines will pick up the permanent signal on the next crawl and start transferring link equity.<\/span>\n  <\/div>\n<\/div>\n\n\n\n<div role=\"alert\" style=\"display:flex;gap:14px;align-items:flex-start;background:#FEF2F2;border:1px solid #FECACA;border-left:4px solid #DC2626;border-radius:10px;padding:16px 18px;margin:20px 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#5B1A1A;line-height:1.55;\">\n  <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"flex:0 0 auto;margin-top:1px;\" aria-hidden=\"true\">\n    <path d=\"M12 3L2 20h20L12 3z\" stroke=\"#DC2626\" stroke-width=\"2\" stroke-linejoin=\"round\"\/>\n    <path d=\"M12 10v4M12 17v.5\" stroke=\"#DC2626\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n  <\/svg>\n  <div>\n    <strong style=\"display:block;font-size:14px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:#B91C1C;margin-bottom:4px;\">Reversing a 301 \u2014 the painful one<\/strong>\n    <span style=\"font-size:15.5px;\">Removing the rule on the server isn&#8217;t enough \u2014 visitors who already hit the 301 have it cached in <em>their<\/em> browser and will keep getting redirected until that cache expires. Your options are to wait out the cache, serve the old URL with fresh no-cache headers, or, in the worst case, ask affected users to clear their browser cache.<\/span>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">You can control how long a 301 stays cached with the <strong><code>Cache-Control<\/code><\/strong> header. By default a 301 may be cached for a long time, but you can cap it \u2014 useful when you want a permanent redirect that&#8217;s still reasonably easy to undo later:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\">HTTP\/1.1 <span class=\"hljs-number\">301<\/span> Moved Permanently\n<span class=\"hljs-attribute\">Location<\/span>: https:\/\/example.com\/new-page\n<span class=\"hljs-attribute\">Cache-Control<\/span>: max-age=86400<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That <code>max-age=86400<\/code> limits caching to one day, so a future change propagates within 24 hours instead of lingering indefinitely. The takeaway: a 301 is permanent <em>by intent<\/em>, but <code>Cache-Control<\/code> lets you decide how stubborn that permanence is in practice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_to_verify_a_301\"><\/span>How to verify a 301<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t trust the browser alone \u2014 it follows and caches redirects, which can hide what&#8217;s really happening. Check the raw response:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Command line:<\/strong> <code>curl -I https:\/\/example.com\/old-page<\/code> shows the status line (<code>HTTP\/1.1 301 Moved Permanently<\/code>) and the <code>Location<\/code> header. Add <code>-L<\/code> to follow the full chain and confirm it&#8217;s a single hop.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/curl-301-moved-permanently-location-1024x683.png\" alt=\"Terminal showing curl -I returning HTTP 301 Moved Permanently with a Location header\" class=\"wp-image-4766\" srcset=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/curl-301-moved-permanently-location-1024x683.png 1024w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/curl-301-moved-permanently-location-300x200.png 300w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/curl-301-moved-permanently-location-768x512.png 768w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/curl-301-moved-permanently-location.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Browser DevTools:<\/strong> open the <strong>Network<\/strong> tab, reload, and look at the status column \u2014 the 301 appears before the final 200, with the <code>Location<\/code> header in the request details. (Tip: enable &#8220;Disable cache&#8221; so a previously cached 301 doesn&#8217;t mislead you.)<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/devtools-network-301-redirect-1024x683.png\" alt=\"Chrome DevTools Network tab showing a 301 redirect followed by a 200 response\" class=\"wp-image-4767\" srcset=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/devtools-network-301-redirect-1024x683.png 1024w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/devtools-network-301-redirect-300x200.png 300w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/devtools-network-301-redirect-768x512.png 768w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/devtools-network-301-redirect.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Online redirect checkers:<\/strong> report every hop from a neutral server, ideal for catching chains and loops.<\/li>\n\n\n\n<li><strong>Google Search Console:<\/strong> after a migration, watch the URL Inspection and indexing reports to confirm Google is registering the new URLs.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/search-console-301-redirect-status-1024x683.png\" alt=\"Search Console showing a URL with a 301 permanent redirect to its new address\" class=\"wp-image-4769\" srcset=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/search-console-301-redirect-status-1024x683.png 1024w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/search-console-301-redirect-status-300x200.png 300w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/search-console-301-redirect-status-768x512.png 768w, https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/search-console-301-redirect-status.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Best-practice_checklist\"><\/span>Best-practice checklist<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<div style=\"max-width:760px;margin:24px auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <div style=\"font-weight:700;font-size:15px;color:#0F172A;margin-bottom:10px;\">301 best-practice checklist<\/div>\n  <div style=\"border:1px solid #E2E8F0;border-radius:12px;overflow:hidden;\">\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#fff;border-bottom:1px solid #EEF2F7;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\">Use a <strong>single hop<\/strong> \u2014 never chain 301s.<\/span>\n    <\/div>\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#F8FAFC;border-bottom:1px solid #EEF2F7;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\">Redirect to the <strong>most relevant page<\/strong>, not the homepage.<\/span>\n    <\/div>\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#fff;border-bottom:1px solid #EEF2F7;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\"><strong>Update internal links<\/strong> to point directly at the new URLs.<\/span>\n    <\/div>\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#F8FAFC;border-bottom:1px solid #EEF2F7;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\">Keep the <strong>canonical tag<\/strong> on the destination consistent with the redirect target.<\/span>\n    <\/div>\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#fff;border-bottom:1px solid #EEF2F7;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\"><strong>Submit an updated sitemap<\/strong> and monitor Search Console.<\/span>\n    <\/div>\n    <div style=\"display:flex;gap:12px;align-items:flex-start;padding:13px 16px;background:#F8FAFC;\">\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"flex:0 0 auto;margin-top:1px;\"><circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#16A34A\"\/><path d=\"M7 12.5l3 3 7-7\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      <span style=\"font-size:15px;color:#334155;\">Be certain the move is <strong>permanent<\/strong> \u2014 because browsers cache it, reversing one is slow and messy.<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<div style=\"max-width:760px;margin:32px auto;background:linear-gradient(135deg,#065F46 0%,#16A34A 100%);border-radius:16px;padding:32px 28px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#fff;box-shadow:0 10px 30px rgba(22,163,74,.25);\">\n  <div style=\"display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap;\">\n    <div style=\"flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:12px;background:rgba(255,255,255,.15);\">\n      <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12h12M12 6l6 6-6 6\"\/><path d=\"M20 4v16\"\/><\/svg>\n    <\/div>\n    <div style=\"flex:1 1 320px;min-width:260px;\">\n      <div style=\"font-size:22px;font-weight:800;line-height:1.25;margin-bottom:8px;\">Migrating a site or changing URLs?<\/div>\n      <p style=\"margin:0 0 18px;font-size:15.5px;line-height:1.6;color:#DCFCE7;\">Set up clean 301 redirects with easy .htaccess access, free SSL, and support that keeps your rankings intact through any domain or HTTPS move. Copahost makes permanent redirects painless.<\/p>\n      <a href=\"https:\/\/www.copahost.com\/web-hosting\" style=\"display:inline-flex;align-items:center;gap:8px;background:#fff;color:#065F46;font-weight:700;font-size:15.5px;text-decoration:none;padding:13px 26px;border-radius:10px;box-shadow:0 4px 12px rgba(0,0,0,.15);\">\n        Explore Copahost hosting\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#065F46\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<section class=\"r301-faq\" style=\"max-width:760px;margin:32px auto;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:#1E293B;\">\n  <style>\n    .r301-faq details{border:1px solid #E2E8F0;border-radius:10px;margin:10px 0;background:#fff;overflow:hidden;}\n    .r301-faq details[open]{border-color:#BBF7D0;box-shadow:0 1px 4px rgba(22,163,74,.08);}\n    .r301-faq summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:12px;padding:16px 18px;font-size:16px;font-weight:600;color:#1E293B;}\n    .r301-faq summary::-webkit-details-marker{display:none;}\n    .r301-faq summary .q{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;background:#F0FDF4;color:#16A34A;font-weight:800;font-size:14px;}\n    .r301-faq summary .chev{margin-left:auto;flex:0 0 auto;transition:transform .2s;color:#94A3B8;}\n    .r301-faq details[open] summary .chev{transform:rotate(180deg);}\n    .r301-faq .ans{padding:0 18px 16px 54px;font-size:15px;line-height:1.65;color:#475569;}\n  <\/style>\n  <div style=\"font-size:24px;font-weight:800;color:#0F172A;margin:0 0 4px;\">Frequently asked questions<\/div>\n  <p style=\"color:#64748B;font-size:15px;margin:0 0 16px;\">Quick answers about the HTTP 301 status code.<\/p>\n  <details>\n    <summary><span class=\"q\">?<\/span>Is HTTP 301 an error?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">No. It&#8217;s a normal, intentional redirect telling clients a URL has permanently moved. It&#8217;s only a problem when misused \u2014 for example, a 301 on a change that was actually temporary, or a redirect chain.<\/div>\n  <\/details>\n  <details>\n    <summary><span class=\"q\">?<\/span>Does a 301 redirect pass SEO value?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">Yes. A single, direct 301 passes essentially all of the old URL&#8217;s link equity to the new one. The old &#8220;you lose ~15%&#8221; rule has been retired by Google.<\/div>\n  <\/details>\n  <details>\n    <summary><span class=\"q\">?<\/span>What&#8217;s the difference between a 301 and a 302?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">301 is permanent \u2014 search engines update to the new URL and transfer ranking. 302 is temporary \u2014 the original URL stays canonical and no permanent transfer is expected. Use 301 for permanent moves, 302 for temporary ones.<\/div>\n  <\/details>\n  <details>\n    <summary><span class=\"q\">?<\/span>301 vs 308 \u2014 which should I use?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">Both are permanent and both pass SEO value. Use a plain 301 for normal page and domain moves. Use 308 only when the HTTP method must be preserved (for example, redirecting a POST and keeping it a POST), such as APIs or form submissions.<\/div>\n  <\/details>\n  <details>\n    <summary><span class=\"q\">?<\/span>Why is a 301 so hard to undo?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">Browsers cache permanent redirects aggressively and remember them, often for a long time. Even after you remove the 301 on the server, returning visitors keep getting redirected from their own cache \u2014 so only use one when you&#8217;re sure the move is permanent.<\/div>\n  <\/details>\n  <details>\n    <summary><span class=\"q\">?<\/span>How long until a 301 takes effect for SEO?<svg class=\"chev\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary>\n    <div class=\"ans\">Browsers follow it immediately, but search engines need to recrawl the old URL to register the move, so rankings transfer over days to weeks. A short dip during a migration is normal.<\/div>\n  <\/details>\n<\/section>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"Is HTTP 301 an error?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. It's a normal, intentional redirect telling clients a URL has permanently moved. It's only a problem when misused \u2014 for example, a 301 on a change that was actually temporary, or a redirect chain.\"}},\n    {\"@type\":\"Question\",\"name\":\"Does a 301 redirect pass SEO value?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. A single, direct 301 passes essentially all of the old URL's link equity to the new one. The old you lose about 15% rule has been retired by Google.\"}},\n    {\"@type\":\"Question\",\"name\":\"What's the difference between a 301 and a 302?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"301 is permanent \u2014 search engines update to the new URL and transfer ranking. 302 is temporary \u2014 the original URL stays canonical and no permanent transfer is expected. Use 301 for permanent moves, 302 for temporary ones.\"}},\n    {\"@type\":\"Question\",\"name\":\"301 vs 308 \u2014 which should I use?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Both are permanent and both pass SEO value. Use a plain 301 for normal page and domain moves. Use 308 only when the HTTP method must be preserved (for example, redirecting a POST and keeping it a POST), such as APIs or form submissions.\"}},\n    {\"@type\":\"Question\",\"name\":\"Why is a 301 so hard to undo?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Browsers cache permanent redirects aggressively and remember them, often for a long time. Even after you remove the 301 on the server, returning visitors keep getting redirected from their own cache \u2014 so only use one when you're sure the move is permanent.\"}},\n    {\"@type\":\"Question\",\"name\":\"How long until a 301 takes effect for SEO?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Browsers follow it immediately, but search engines need to recrawl the old URL to register the move, so rankings transfer over days to weeks. A short dip during a migration is normal.\"}}\n  ]\n}\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The HTTP 301 is the workhorse of permanent redirects and the backbone of any clean site migration. Its value is simple: it sends people and search engines to the new URL <strong>and<\/strong> carries the old page&#8217;s authority with it \u2014 close to 100% of it, in a single hop. The flip side is permanence: browsers cache a 301 so persistently that reversing one is painful, so the golden rule is to use it only when you&#8217;re certain the move won&#8217;t be undone. Get that right \u2014 single hops, relevant targets, updated internal links \u2014 and a 301 protects your traffic through any URL change. When the move is only temporary, reach for a <a href=\"https:\/\/www.copahost.com\/blog\/http-302\/\">302<\/a> instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>You change a URL, move to a new domain, or finally switch your site to HTTPS \u2014 and you need every visitor, every bookmark, and every search engine to land on the new address without losing the traffic and rankings you&#8217;ve built. That&#8217;s the job of the HTTP 301. Used correctly, it&#8217;s the single most [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4765,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[177],"tags":[],"class_list":["post-4764","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost<\/title>\n<meta name=\"description\" content=\"HTTP 301 &quot;Moved Permanently&quot; is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.copahost.com\/blog\/http-301\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost\" \/>\n<meta property=\"og:description\" content=\"HTTP 301 &quot;Moved Permanently&quot; is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.copahost.com\/blog\/http-301\/\" \/>\n<meta property=\"og:site_name\" content=\"Copahost\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-16T18:27:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-16T19:19:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gustavo Gallas\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gustavo Gallas\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/\"},\"author\":{\"name\":\"Gustavo Gallas\",\"@id\":\"https:\/\/www.copahost.com\/blog\/#\/schema\/person\/386b3f1f79299d43f4ceb33d26428246\"},\"headline\":\"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It\",\"datePublished\":\"2026-06-16T18:27:41+00:00\",\"dateModified\":\"2026-06-16T19:19:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/\"},\"wordCount\":2394,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png\",\"articleSection\":[\"Web Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.copahost.com\/blog\/http-301\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/\",\"url\":\"https:\/\/www.copahost.com\/blog\/http-301\/\",\"name\":\"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost\",\"isPartOf\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png\",\"datePublished\":\"2026-06-16T18:27:41+00:00\",\"dateModified\":\"2026-06-16T19:19:47+00:00\",\"description\":\"HTTP 301 \\\"Moved Permanently\\\" is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.copahost.com\/blog\/http-301\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage\",\"url\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png\",\"contentUrl\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png\",\"width\":1672,\"height\":941,\"caption\":\"HTTP 301 Moved Permanently redirect passing SEO value to a new URL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.copahost.com\/blog\/http-301\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.copahost.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.copahost.com\/blog\/#website\",\"url\":\"https:\/\/www.copahost.com\/blog\/\",\"name\":\"Copahost\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.copahost.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.copahost.com\/blog\/#organization\",\"name\":\"Copahost\",\"url\":\"https:\/\/www.copahost.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.copahost.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2016\/03\/copahostlogo.png\",\"contentUrl\":\"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2016\/03\/copahostlogo.png\",\"width\":223,\"height\":40,\"caption\":\"Copahost\"},\"image\":{\"@id\":\"https:\/\/www.copahost.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.copahost.com\/blog\/#\/schema\/person\/386b3f1f79299d43f4ceb33d26428246\",\"name\":\"Gustavo Gallas\",\"description\":\"Graduated in Computing at PUC-Rio, Brazil. Specialized in IT, networking, systems administration and human and organizational development\u200b. Also have brewing skills.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/gustavo-gallas-107926196\/\"],\"url\":\"https:\/\/www.copahost.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost","description":"HTTP 301 \"Moved Permanently\" is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.copahost.com\/blog\/http-301\/","og_locale":"en_US","og_type":"article","og_title":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost","og_description":"HTTP 301 \"Moved Permanently\" is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.","og_url":"https:\/\/www.copahost.com\/blog\/http-301\/","og_site_name":"Copahost","article_published_time":"2026-06-16T18:27:41+00:00","article_modified_time":"2026-06-16T19:19:47+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png","type":"image\/png"}],"author":"Gustavo Gallas","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Gustavo Gallas","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.copahost.com\/blog\/http-301\/#article","isPartOf":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/"},"author":{"name":"Gustavo Gallas","@id":"https:\/\/www.copahost.com\/blog\/#\/schema\/person\/386b3f1f79299d43f4ceb33d26428246"},"headline":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It","datePublished":"2026-06-16T18:27:41+00:00","dateModified":"2026-06-16T19:19:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/"},"wordCount":2394,"commentCount":0,"publisher":{"@id":"https:\/\/www.copahost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage"},"thumbnailUrl":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png","articleSection":["Web Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.copahost.com\/blog\/http-301\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.copahost.com\/blog\/http-301\/","url":"https:\/\/www.copahost.com\/blog\/http-301\/","name":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It - Copahost","isPartOf":{"@id":"https:\/\/www.copahost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage"},"image":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage"},"thumbnailUrl":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png","datePublished":"2026-06-16T18:27:41+00:00","dateModified":"2026-06-16T19:19:47+00:00","description":"HTTP 301 \"Moved Permanently\" is a permanent redirect that passes SEO value to the new URL. Learn what it means, 301 vs 302\/308, variations, and how to set one up.","breadcrumb":{"@id":"https:\/\/www.copahost.com\/blog\/http-301\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.copahost.com\/blog\/http-301\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.copahost.com\/blog\/http-301\/#primaryimage","url":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png","contentUrl":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2026\/06\/http-301-moved-permanently-featured.png","width":1672,"height":941,"caption":"HTTP 301 Moved Permanently redirect passing SEO value to a new URL"},{"@type":"BreadcrumbList","@id":"https:\/\/www.copahost.com\/blog\/http-301\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.copahost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"HTTP 301 (Moved Permanently): What It Means, Variations, and How to Use It"}]},{"@type":"WebSite","@id":"https:\/\/www.copahost.com\/blog\/#website","url":"https:\/\/www.copahost.com\/blog\/","name":"Copahost","description":"","publisher":{"@id":"https:\/\/www.copahost.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.copahost.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.copahost.com\/blog\/#organization","name":"Copahost","url":"https:\/\/www.copahost.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.copahost.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2016\/03\/copahostlogo.png","contentUrl":"https:\/\/www.copahost.com\/blog\/wp-content\/uploads\/2016\/03\/copahostlogo.png","width":223,"height":40,"caption":"Copahost"},"image":{"@id":"https:\/\/www.copahost.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.copahost.com\/blog\/#\/schema\/person\/386b3f1f79299d43f4ceb33d26428246","name":"Gustavo Gallas","description":"Graduated in Computing at PUC-Rio, Brazil. Specialized in IT, networking, systems administration and human and organizational development\u200b. Also have brewing skills.","sameAs":["https:\/\/www.linkedin.com\/in\/gustavo-gallas-107926196\/"],"url":"https:\/\/www.copahost.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/posts\/4764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/comments?post=4764"}],"version-history":[{"count":6,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/posts\/4764\/revisions"}],"predecessor-version":[{"id":4782,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/posts\/4764\/revisions\/4782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/media\/4765"}],"wp:attachment":[{"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/media?parent=4764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/categories?post=4764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.copahost.com\/blog\/wp-json\/wp\/v2\/tags?post=4764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}