What causes soft 404s
- An empty internal search results page, or a listing with no items.
- A server-side failure, such as a missing include file or a broken database connection, after which the template shows an error with a 200 status.
- A JavaScript app with client-side routing that renders “not found” for a URL that does not exist while the server still answers 200.
- A page whose resources did not load for Googlebot, for example blocked by robots.txt, too slow or too large, so it renders blank.
- Redirecting many old URLs to one irrelevant page, such as the home page. Google states this might be treated as a soft 404.
Why soft 404s matter
A URL flagged as a soft 404 does not appear in search results. If it is a valuable page that only renders badly, you lose it from the index without any error on the server side.
If the page really is empty, the 200 status misleads users and crawlers. Google lists soft 404 pages among the URLs that, on large sites, can take crawling away from more important pages. On a small site the effect is usually minor, but a misleading status is still worth fixing.
How to fix a soft 404
| Situation | What to do |
|---|---|
| The content is gone and has no replacement | Return 404 or 410. A custom error page can help users, as long as the server returns 404. |
| The content moved or has a clear equivalent | Redirect with a 301 to that specific URL, not to the home page. |
| The content exists, but Google sees a blank page | Check the rendered page in the URL Inspection tool. Unblock resources and fix rendering errors. |
| The page is empty by design, such as no results | Add content that helps users, or keep it out of the index with noindex. |
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=utf-8HTTP/1.1 301 Moved Permanently
Location: https://example.com/shoes/womens-sneakersSoft 404s in JavaScript apps
When routing happens in the browser, the server cannot always return the right status. Google suggests two options: a JavaScript redirect to a URL for which the server returns 404 (such as /not-found), or adding a robots noindex meta tag to the error page. If your framework renders pages on the server, the simplest fix is to return 404 from the server directly.
const res = await fetch(`/api/products/${id}`);
if (res.status === 404) {
// The server answers /not-found with a 404 status
window.location.href = '/not-found';
} else {
renderProduct(await res.json());
}How to check for soft 404s
- Open the Page indexing report in Search Console and find the reason “Soft 404”.
- For a few sample URLs, run a live test in the URL Inspection tool and look at the screenshot and HTML of the rendered page.
- Compare the server’s status code with what users see, for example with curl -I.
- Pick the fix: 404 or 410, a 301 to an equivalent, or repair the content and rendering. After deploying, start fix validation in the report.
$ curl -I https://example.com/product-that-does-not-exist
HTTP/2 200
# The page shows “Product not found”, but the server returns 200.A soft 404 is a page that returns HTTP 200 while telling users the content does not exist, or showing an empty page. Google treats it as an error page, does not index it and lists it in the Search Console Page indexing report with the reason “Soft 404”.
A regular 404 is a correct signal: the server says the page does not exist. With a soft 404 the server returns 200 while the content says otherwise. A 404 for a removed page is not a problem; the mismatch between status and content is.
Google does not describe soft 404s as a site-wide penalty. The effect applies to the affected URL, which is not indexed. With many such URLs, however, crawlers can spend time on worthless pages at the expense of important ones.
Not as a default. Google warns that redirecting many old URLs to one irrelevant destination, such as the home page, might be treated as a soft 404. Redirect to a real equivalent, or return 404 or 410.
Google treats them the same. All 4xx codes except 429 signal that the content does not exist, and already indexed URLs are removed from the index. Use whichever describes the situation better: 410 says the removal is deliberate and permanent.
If the server cannot return 404 for a URL that does not exist, redirect with JavaScript to a URL served with 404, such as /not-found, or add a robots noindex meta tag to the error page. With server-side rendering, return 404 directly.