Skip to main content
SiteScan.top

Soft 404: the missing page that answers 200 OK

Why a not-found page that returns 200 fills the index with garbage, blinds your monitoring, and how to make the server tell the truth about missing addresses.

SEO · Published: 27 September 2026 · 6 min read · Марк Лебедев

A 404 is not a failure. It is the server answering an honest question honestly: there is nothing at this address. A soft 404 is the same answer with the wrong status code — the page says "not found", the HTTP response says 200 OK. Humans read the page; crawlers, monitors and caches read the status. Everyone except the human gets lied to.

Where they come from

Almost nobody writes a soft 404 on purpose. They fall out of reasonable-looking defaults:

Why it hurts

Garbage in the index. Typos, old campaign URLs and scanner probes all become "pages". Google eventually spots many of them and lists them in the Search Console Soft 404 report — but only after crawling them, and not all of them.

Crawl budget. Every fake page is a fetch the crawler did not spend on real content. On a large site with parameterised listings this is not a rounding error.

Duplicates of the home page. Blanket redirects and SPA shells make thousands of URLs resolve to the same content, which muddies canonical selection for the page you actually care about.

Blind monitoring. Uptime checks, link checkers and synthetic tests look at the status code. If dead links answer 200, every broken-link audit reports a clean site.

Polluted analytics. Hits on nonexistent pages are counted as normal page views, with normal bounce and time-on-page. The "not found" traffic never shows up as an error.

How to test

Request an address that cannot exist and look only at the status:

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/this-page-does-not-exist-8f3a/

Anything other than 404 or 410 is a problem. Repeat for each template that has its own routing: /blog/nonexistent, /product/nonexistent, /search?q=zzzzqx, a missing locale prefix. A SiteScan report does this for you: it checks what the server answers for an address that does not exist and flags a 200.

The fixes

Return a real 404. For a static or prerendered site, let nginx serve a prebuilt page with the right status:

error_page 404 /404.html;
location / {
    try_files $uri $uri/ =404;
}

For an SPA with server rendering, the server has to know the route table: if no route matches, or the route matches but the record does not exist, respond with 404 before streaming the HTML. If the server truly cannot know — a pure client-side app behind a dumb host — add <meta name="robots" content="noindex"> to the client-rendered not-found view. That is a last resort: it keeps the page out of the index, but monitors and link checkers still see 200.

Use 410 for content removed for good. A discontinued product or a deleted article is "gone", not "not found". 410 tells crawlers to stop asking sooner.

Redirect only to a genuine equivalent. A 301 is correct when the content moved — the renamed article, the replacement model. A blanket redirect to the home page is not a fix; it is a soft 404 with an extra hop.

Make the 404 page useful, not successful. Search, links to the main sections, for us the scan input — all of it fits on an error page. The page can be as helpful as you like; the status code still has to be 404.

Check-list

  1. A random URL on every routing template returns 404.
  2. Empty search and listing pages are noindex or 404.
  3. Removed content returns 410 or a 301 to a real equivalent.
  4. No catch-all redirect to the home page.
  5. Bot challenges return 403 or 429, not 200.
  6. The 404 page helps the visitor and still answers 404.

Read next

Check how much of this is on your own site

A free scan surfaces broken links, JS errors and performance problems in about a minute.