An HTTP status code is the three-digit number a server sends before every page. 2xx means it worked, 3xx means the page moved, 4xx means the request was wrong or the page is missing, and 5xx means the server failed. For SEO, use 301 for permanent moves, 404 or 410 for removed pages and 503 for maintenance.
| Range | Class | What it means for your site |
|---|---|---|
| 100 to 199 | Informational | Rarely seen by owners; the connection is still in progress |
| 200 to 299 | Success | The page was delivered and can be indexed |
| 300 to 399 | Redirection | The visitor is sent to another URL |
| 400 to 499 | Client error | Missing page, bad request or no permission |
| 500 to 599 | Server error | Your hosting or app failed; fix fast |
Updated
Developer references list every code ever defined. Site owners need something narrower: which code is my page returning, what does a visitor see, what will Google do with it, and how do I fix it. Search the table below by number or word, then read the SEO and fix sections.
| Code | Name | Visitors see | Search engines |
|---|---|---|---|
| 200 | OK | The page loads normally | Eligible for indexing |
| 201 | Created | Usually an API reply after saving something | Not relevant to pages |
| 204 | No Content | Nothing changes on screen | Nothing to index |
| 301 | Moved Permanently | Sent to the new URL automatically | Strong signal to show the new URL |
| 302 | Found | Sent to another URL for now | Weak signal; old URL may stay in results |
| 303 | See Other | Sent to a result page after a form | Treated like a temporary redirect |
| 304 | Not Modified | The cached copy is shown | Content unchanged since the last crawl |
| 307 | Temporary Redirect | Sent elsewhere, same method kept | Weak signal, like 302 |
| 308 | Permanent Redirect | Sent elsewhere, same method kept | Strong signal, like 301 |
| 400 | Bad Request | An error page; the link or form data is malformed | Not indexed |
| 401 | Unauthorized | A login prompt | Not indexed |
| 403 | Forbidden | Access denied message | Not indexed |
| 404 | Not Found | Your not-found page | Not indexed; dropped if it was indexed |
| 405 | Method Not Allowed | An error after submitting a form the wrong way | Not indexed |
| 410 | Gone | Your not-found page | Not indexed; same handling as 404 |
| 429 | Too Many Requests | A rate limit message | Treated as a server error; crawling slows |
| 451 | Unavailable For Legal Reasons | A notice that the page is blocked for legal reasons | Not indexed |
| 500 | Internal Server Error | A generic error page | Crawling slows; persistent errors drop URLs |
| 502 | Bad Gateway | Error from the proxy or CDN in front of your app | Crawling slows; persistent errors drop URLs |
| 503 | Service Unavailable | Maintenance or overload page | Crawling slows; fine for short downtime |
| 504 | Gateway Timeout | The page hangs, then errors | Crawling slows; persistent errors drop URLs |
| Code | Likely cause | Vercel or Netlify | cPanel or Apache |
|---|---|---|---|
| 403 | File permissions, IP block or missing index file | Check password protection and firewall rules in project settings | Set folders to 755 and files to 644; check .htaccess deny rules |
| 404 | Wrong path, deleted page or missing SPA fallback | Add a rewrite to index.html for client-side routes; check the output folder | Check the file exists in public_html and slugs match case |
| 500 | App crash or bad server config | Open the function logs for the failing request | Read the error log; a broken .htaccess line is a frequent cause |
| 502 | Upstream app crashed or returned garbage | Check function logs and timeouts | Restart PHP-FPM or the app; check memory limits |
| 503 | Overloaded, paused or in maintenance | Check usage limits and paused deployments | Check resource limits in the host dashboard |
Goes in .htaccess. The first line sends an old URL to its replacement with 301; the second returns 410 for a page that is gone for good.
Redirect 301 /old-pricing /pricing
Redirect gone /2019-summer-saleA _redirects file in the publish folder. The last rule serves the app shell for client-side routes with a 200 status.
/old-pricing /pricing 301
/blog/* /articles/:splat 301
/* /index.html 200A tiny Node handler that tells crawlers to come back in an hour instead of indexing the maintenance message.
import http from "node:http";
http.createServer((req, res) => {
res.writeHead(503, { "Content-Type": "text/html; charset=utf-8", "Retry-After": "3600" });
res.end("<h1>Back soon</h1><p>We are updating the site.</p>");
}).listen(3000);
Crawlers decide what to do with a URL from its status before reading a single word. A friendly error page with a 200 status looks like real content; a working page that accidentally returns 404 disappears from search.
Status codes are set by your server, host or framework, so the same mistake often repeats across thousands of URLs. Checking a handful of representative pages after every deploy catches it early.
A chain happens when page A redirects to B, which redirects to C. It usually builds up over years of migrations: http to https, then non-www to www, then an old slug to a new one.
Each hop adds a round trip before anything renders. Flatten chains by pointing every old URL directly at the final destination, and update internal links so they never hit a redirect at all.
Google treats 301 and 308 as a strong signal that the new URL should be the one shown in search, and 302 and 307 as a weak signal. Use 301 when the move is permanent and 302 only when the original URL will come back.
Either works. Google's documentation says it treats all 4xx codes other than 429 the same way: the URL is not indexed, and indexed URLs returning them are dropped. 410 states more precisely that the removal is intentional and permanent.
A soft 404 is a page that tells people it does not exist, or is nearly empty, while the server still returns 200. Search Console reports these. Fix them by returning a real 404 or 410, or by putting useful content on the page.
Short outages are tolerated. Google slows its crawling when it sees 5xx responses or 429, and URLs that keep failing are eventually removed from the index. Fix persistent server errors quickly and use 503 for planned maintenance.
Both keep the original request method, so a form POST stays a POST after the redirect. 307 is temporary and 308 is permanent. 301 and 302 allow clients to switch a POST to GET, which is why APIs prefer 307 and 308.
Related: Redirect checker, Site migration SEO checklist, Sitemap and robots.txt examples, Next.js SEO checklist, Canonical tag checker.
Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.
We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.