Semhack
FeaturesPricingFree toolsBlogHelp
Sign inStart free
  • Features
  • Pricing
  • Free tools
  • Blog
  • Help
  • Sign in
Semhack

SEO audits and Search Console data in one weekly list for your whole team: find what’s broken, know what it costs, prove the fix worked.

Not affiliated with Google.

Product

  • All features
  • Site audit
  • Search Console
  • Monitoring and alerts
  • Explorer and keywords
  • Competitor comparison
  • Client reports
  • Team and collaboration
  • API and integrations
  • Pricing
  • Changelog

Free tools

  • SERP Snippet Preview
  • Meta Tag Checker
  • Schema Markup Generator
  • Redirect Checker
  • Robots.txt Tester
  • Website and domain tools
  • Developer tools
  • Text and content tools
  • All 42 free tools

Company

  • About
  • Blog
  • Help center
  • Developers
  • Security
  • Our crawler
  • Contact
© 2026 Semhack
Privacy·Terms·Security·RSS
Home/Blog/Technical audits

Soft 404s: what they are, how to find them and how to fix them

A soft 404 is a page that says it doesn't exist but answers 200 OK. Here's how they happen, how to find every one on a site, and the right fix for each case.

SESemhack Editorial·Published Nov 5, 2026·5 min read
On this page
  1. Why soft 404s are worth fixing
  2. What causes them
  3. How to find soft 404s
  4. Request a page that can't exist
  5. Check Search Console
  6. Crawl the site
  7. Read your server logs
  8. How to fix them
  9. Sending the right status
  10. Old URLs you no longer want
  11. Check your work

Every web page comes back with a status code before any content. 200 means "here is the page", 404 means "there's nothing here", 410 means "there was something here and it's gone for good". A soft 404 is a page whose content says one thing ("Sorry, this page doesn't exist") while its status code says another (200 OK).

People see an error page either way. Search engines see a working page with very little on it, and have to guess. Google's documentation calls these soft 404s, reports them in Search Console, and recommends returning a real 404 or 410 instead.

Why soft 404s are worth fixing

  • Error pages can end up in search results. A crawler that gets 200 has no protocol-level reason to drop the URL. Google usually works it out from the content, but that's a guess you don't need it to make.
  • Crawling time goes to pages that don't exist. On a large site, every soft 404 that gets recrawled is a request not spent on a page you want indexed.
  • They hide real problems. A broken link to a page that answers 404 shows up in every crawler and log. The same broken link to a soft 404 looks like a working page.
  • They make your reports wrong. Monitoring, analytics and audits all trust the status code. A site that never returns 404 looks perfectly healthy while visitors hit dead ends.

What causes them

Most soft 404s come from a handful of setups:

  1. The server sends the error page with the wrong status. A custom "not found" page is configured, but the server returns it with 200. In nginx, error_page 404 =200 /404.html; does exactly that; the =200 overrides the status.
  2. Missing URLs redirect to the homepage. Some sites send every unknown address to the homepage with a 301 or 302. Google's documentation says that redirecting a missing page to an irrelevant one, such as the homepage, may be treated as a soft 404, and visitors land somewhere that isn't what they asked for.
  3. JavaScript apps render "not found" in the browser. In a single-page app, the server returns the same HTML shell with 200 for every URL, and the app shows a "not found" screen only after its code runs. The status code never changes.
  4. Catch-all routes in a CMS or framework. A route like /blog/[slug] renders an empty template, or a search page, for slugs that don't exist, instead of returning 404.
  5. Pages that exist but say almost nothing. Empty category pages, internal search results with no results, or discontinued products reduced to a title. Google may treat very thin pages like these as soft 404s too, even when they aren't errors.

How to find soft 404s

Request a page that can't exist

The fastest test: ask the site for an address nobody has ever linked to, such as /this-page-does-not-exist-7f3a, and look at the status code. Our website status checker and HTTP headers checker show it, or from a terminal:

curl -sI https://example.com/this-page-does-not-exist-7f3a | head -n 1
  • HTTP/2 404 or 410: the site handles missing pages correctly.
  • HTTP/2 200: every missing URL on the site is a soft 404.
  • HTTP/2 301 or 302: follow the redirect (the redirect checker shows every hop). If it lands on the homepage, you have pattern 2 above.

The 404 page check in every Semhack audit does exactly this, with a random path on the audited site: it passes on 404 or 410, fails on a 2xx status, and warns when the missing page redirects or returns something else.

Check Search Console

In Search Console, open Indexing → Pages and look for the reason Soft 404 in the list of reasons pages aren't indexed. Click it to see example URLs. Use URL Inspection on one of them to see what Google fetched.

Search Console only lists URLs Google has crawled and decided about, so treat it as confirmation, not a complete list.

Crawl the site

A crawl finds soft 404s that no-one has reported yet, because it reaches pages through your own links. Look for pages that answer 200 but whose title or main heading reads like an error: "404", "Page not found", "This page doesn't exist".

Semhack's site audit does this on every page it crawls: pages that return 200 while their title or H1 looks like an error page (in English and several other languages) are listed as Possible soft 404s. The word "possible" matters. An article titled "Page not found errors, explained" matches the pattern without being an error, so check each one before you change anything.

Read your server logs

Logs show which URLs crawlers and visitors actually request. Look for URLs that return 200 with an unusually small response size, or a single template, across many different paths.

How to fix them

The right fix depends on whether the page should exist.

The URL…Answer withWhy
…never existed, or the content is simply missing404 Not FoundThe standard answer. Keep a helpful error page, just send it with the right status
…existed and was removed on purpose, with no replacement410 GoneSays the removal is deliberate. Search engines treat 404 and 410 very similarly; 410 is the more explicit of the two
…has a real replacement with the same purpose301 to that pageVisitors and links reach the equivalent page. Don't redirect to the homepage or to a loosely related page
…is a real page with too little on it200, with real content, or noindexAdd what's missing, merge it into a stronger page, or keep it out of the index

Sending the right status

  • nginx: use error_page 404 /404.html;, without =200.
  • Apache: use a local path, as in ErrorDocument 404 /404.html. With a full URL (ErrorDocument 404 https://example.com/404.html), Apache redirects to it instead, and the visitor never gets a 404 status.
  • Frameworks: most have a built-in way to stop rendering and answer 404 from the server, such as notFound() in Next.js or abort(404) in Laravel and Flask. Use it in the route that loads the content, as soon as you know the item doesn't exist.
  • JavaScript apps without server rendering: Google's JavaScript SEO guide suggests two options when the status can't change: redirect to a URL where the server does return 404, or add <meta name="robots" content="noindex"> to the page when the app shows its error view.

Old URLs you no longer want

If your domain hosted something else before, crawlers may keep asking for addresses that have nothing to do with your site today. Don't redirect those to your homepage. Answer 410 and let them drop out. On semhack.com, for example, the URLs left over from the domain's previous owner answer 410 Gone.

Check your work

After a fix, repeat the tests: request a made-up URL again, check the status of a few previously affected pages, and recrawl the site. In Search Console, open the Soft 404 reason in the Pages report and click Validate fix so Google rechecks the listed URLs. Expect the count to fall over the following weeks rather than overnight; Google has to recrawl each URL first.

Free tools for this

No sign-up needed.

  • Website Status CheckerCheck if a website is up or down right now: HTTP status code, response time and redirects, tested live from our server.
  • HTTP Headers CheckerSee every HTTP response header a URL returns and get a security grade for HSTS, CSP, X-Frame-Options and more, with fixes.
  • Redirect CheckerFollow every redirect hop for a URL, see 301/302 status codes and response times, and catch chains and loops.

In Semhack: Site audit

40 checks on any page, a crawl of the whole site, and Core Web Vitals from PageSpeed Insights.

Start freeHow it works
SE

Semhack Editorial

The team that builds Semhack

Articles from the people building Semhack, an SEO audit and Search Console tool for freelancers and small agencies. We write about the problems the product checks for, explain how we measure things, and link to the sources we rely on. When something we wrote turns out to be wrong, we fix it and change the updated date.

On this page

  1. Why soft 404s are worth fixing
  2. What causes them
  3. How to find soft 404s
  4. Request a page that can't exist
  5. Check Search Console
  6. Crawl the site
  7. Read your server logs
  8. How to fix them
  9. Sending the right status
  10. Old URLs you no longer want
  11. Check your work

Keep reading

  • Technical audits

    A practical technical SEO audit checklist: 40 checks explained

    The 40 page-level checks a technical SEO audit should cover, grouped into SEO, security, performance and markup, with what each one looks for and how to fix it.

    Nov 5, 2026 · 7 min read

  • Using Search Console

    How to find out why a page lost Google clicks, with Search Console

    A step-by-step Search Console method for working out why one page's clicks fell, using the way clicks, impressions, CTR and position move together.

    Nov 5, 2026 · 7 min read