404 Not Found
The server cannot find a current representation of the requested resource, and does not say whether the absence is temporary.
Defined in RFC 9110 §15.5.5
What 404 means
404 Not Found means the origin server did not find a current representation for the target resource, and it is not disclosing whether the absence is temporary or permanent. It is the internet's most recognized status code, used both for resources that genuinely never existed and, deliberately, as a way to hide the existence of resources a server would rather not confirm, since a server may return 404 instead of 403 for that reason. Because it carries no information about why the resource is missing, well-built error pages and APIs supplement it with a body explaining next steps.
A soft 404 occurs when a page displays "not found" content to a human but the server actually returns HTTP 200, which is invisible to monitoring tools, uptime checks, and search engine crawlers that key off the status line rather than the rendered content. Google Search Console flags soft 404s explicitly because they waste crawl budget and can leave dead pages indexed. For SEO generally, a deliberately removed page should use 410 Gone rather than 404 when the removal is permanent and intentional, and a moved page should use a 301 redirect rather than a 404 followed by a manual link update.
URL normalization is a frequent, avoidable source of 404s: Linux-based servers are case-sensitive by default, so /About and /about can resolve differently even though users treat them as identical, and a missing or extra trailing slash can likewise route to a different or nonexistent handler depending on the framework's routing rules. The fix is consistent server-side normalization, redirecting variants to one canonical form, rather than expecting every internal link and external backlink to match exactly.
Single-page applications routed entirely on the client side are a common self-inflicted 404: the router handles /dashboard/settings fine when navigated to from within the app, but a hard refresh or a direct link sends that URL straight to the server, which has no matching route and returns a real 404. The standard fix is a server or CDN fallback, such as nginx's try_files or a platform-level SPA rewrite rule, that serves index.html for unmatched paths and lets client-side routing take over from there.
Common causes
- The resource was deleted or moved without a redirect being put in place.
- The URL contains a typo, or its casing doesn't match a case-sensitive server's stored path.
- A trailing slash mismatch routes to a different handler, or none, than the canonical URL.
- A single-page app route is requested directly or refreshed, and the server has no matching route for it.
- DNS, load balancer, or reverse-proxy routing sends the request to the wrong backend entirely.
- The page returns HTTP 200 with "not found" content instead of a true 404 status, a soft 404, confusing crawlers and monitoring.
How to fix a 404
If you are the client (browser user or API caller)
- Double-check the URL for typos and correct casing before assuming the resource is gone.
- Follow any redirect or Location header the server provides rather than re-requesting the old URL.
- Use the site's search or sitemap instead of guessing at a URL structure.
- Clear cached bookmarks or links to resources that may have been renamed or restructured.
- Report the broken link to the site owner, including the referring page, so it can be fixed at the source.
If you run the server
- Set up 301 redirects from retired URLs to their new location instead of leaving them to 404.
- Configure the server or CDN to fall back to the SPA's index.html for unmatched routes, for example with nginx's try_files.
- Normalize casing and trailing slashes with a redirect to one canonical URL rather than serving different content for each variant.
- Ensure custom error pages still return a true 404 status code, not 200, to avoid soft 404s.
- Use 410 Gone instead of 404 for content removed deliberately and permanently, and resubmit an updated sitemap after large URL changes.
Example
GET /products/discontinued-widget HTTP/1.1
Host: shop.example.com
HTTP/1.1 404 Not Found
Content-Type: text/html
<!doctype html>
<title>Page not found</title>
<p>We couldn't find that product. It may have been removed or renamed.</p>Try it live
Our free status responder returns a real HTTP 404 you can point tests, monitors or a browser at.
GET https://mcp.httpstatus.com/status/404