What a soft 404 is
A soft 404 is a URL that tells visitors the page doesn't exist, or shows no real content, while the server answers 200 OK. It is the term Google uses: Search Console lists such URLs as Soft 404 in its page indexing report.
Software reads the status code first. To a cache, a crawler or a link checker, 200 means the page exists and worked, so a not-found message sent with 200 looks like a real page.
You can keep the friendly not-found page. Only the status code needs to change.
Why soft 404s cause problems
Search engines have to work out from the content that the page is an error. Google's crawl budget guidance notes that soft 404 pages continue to be crawled and waste crawl budget that could go to real pages.
Audits are misled too. A status check sees 200 and reports a working page, so links that land on a soft 404 never show up as broken.
Caches can store a failure as a success. If a database outage renders an empty template with 200, a CDN may serve that empty page to everyone until it expires.
Common causes of soft 404s
Most soft 404s come from code that renders a page for any URL without first checking that the content exists:
- A single-page app that serves the same index.html for every path, or a /products/[id] route that renders "Product not found" without setting a status, returns 200 for anything.
- Internal search pages with no results, and tag or category pages with no items, return 200 with nothing on them.
- Redirecting every missing URL to the homepage sends visitors somewhere they didn't ask for. Google's site-move guidance warns that it might treat such redirects as soft 404s.
- A custom error page set up as a normal page, or an error handler that renders a message without setting a status code, answers 200.
- A deleted product or listing left in place as a shell that only says it is no longer available.
How to test a site for soft 404s
Request a URL that can't exist on your site and check the status code. You want 404 or 410. A 200 means a catch-all route is answering, and a 3xx usually means missing pages are being redirected.
Repeat the test for each kind of route, because product pages, search and blog posts often have their own handlers. Try a made-up product ID, a deleted item and a search with no results.
# Expect 404 (or 410) for a page that doesn't exist
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/this-page-does-not-exist-7f3a9c
# If you get a 3xx, see where it sends visitors
curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' https://example.com/this-page-does-not-exist-7f3a9cFinding soft 404s across a site
The page indexing report in Search Console lists the URLs Google classified as Soft 404. In a site crawl, look for pages that return 200 but share a title such as "Page not found" or have almost no text.
Automated status checks see only part of the problem. MemonaIQ's URL Intelligence Platform flags only a 200 response with an empty body as a soft 404, so a not-found page with normal HTML looks healthy to it. The Website Launch Readiness Checker requests one random missing page to see whether your site answers 404.
How to fix a soft 404
Send the status code that matches reality, and keep the helpful page for people.
- Return 404 for URLs that don't exist, with a custom page that offers search or links to popular sections.
- Return 410 for content you removed on purpose and won't replace. Google's crawlers treat 404 and 410 the same way, so either works for search.
- Redirect with a 301 only when a close replacement exists, such as a newer version of the same product.
- In a server-rendered app, make sure the not-found branch sets the status, usually through the framework's not-found helper rather than a rendered message.
- In an app rendered only in the browser, Google suggests a JavaScript redirect to a URL that returns a real 404, such as /not-found. Its other suggestion is a noindex robots meta tag added to error views with JavaScript.
- Don't block missing URLs in robots.txt. Crawlers then can't fetch them and never see the 404.
- If Google flags a real page as a soft 404, the page probably looked empty when Google rendered it. Inspect the URL in Search Console to see the rendered page, then add the missing content or fix the rendering error.