We respect your privacy.

We use strictly necessary cookies to keep you signed in and to protect against CSRF. With your permission we also use a small amount of first-party analytics to improve the product. We do not sell your data and we do not use third-party advertising trackers. See our cookie policy and privacy policy .

← All learn topics

Rule site.soft-404

Pages return 200 but say "not found"

site.soft-404 is a check in Crawlmind's site audit that grades medium-impact issues of this kind. This page explains why the rule matters and the exact fix.

Impact: mediumEffort: mediumFixable: 1-click

Why it matters

A soft 404 is a page that returns HTTP 200 (success) but whose content tells the visitor the resource is missing: the classic not-found headline, "Article deleted", "Sorry, we couldn't find what you were looking for." Search engines penalise these because they fragment the index with non-content URLs and waste crawl budget. AI engines see them as low-quality and either skip them or cite their misleading title as if it were real content.

The fix

A real "not found" response:

```http
HTTP/2 404
content-type: text/html; charset=utf-8

<!DOCTYPE html>
<html><body><h1>Page not found</h1>...</body></html>
```

A soft 404 (the bug):

```http
HTTP/2 200
content-type: text/html; charset=utf-8

<!DOCTYPE html>
<html><body><h1>Page not found</h1>...</body></html>
```

Fix at the framework level. In Next.js:

```ts
// pages/[slug].tsx
export async function getStaticProps({ params }) {
  const post = await fetchPost(params.slug);
  if (!post) return { notFound: true }; // emits a real 404
  return { props: { post } };
}
```

In Nuxt:

```ts
const { data: post } = await useFetch(`/api/posts/${slug}`);
if (!post.value) throw createError({ statusCode: 404, statusMessage: 'Post not found' });
```

Validate via Google Search Console (Crawl > Stats > Soft 404 report).

References