soft 404:不存在的地址,27 个首页返回了什么
soft 404 指页面不存在却回了成功码。2026-08-18 读的 27 个首页里 23 个老实回 404、2 个回 200,但 404 响应体中位数 68,678 字节,最大的一个 1.3 MB。

实测 · 2026-08-18 · 30 个站 · 单次快照
样本与口径:与我们做 robots.txt、sitemap、首页结构三次调查完全相同的 30 个站。每站请求一个我们自己编的路径,浏览器 User-Agent,2026-08-18,出口在日本。3 个站在首页就拒绝了我们,分母是 27。同一次抓取供本批另外四篇用。
soft 404 指的是「这个页面不存在,服务器却回了个成功状态码」。我们向 27 个首页要了一个从没有人链接过的路径:23 个老实返回 404,2 个返回 200,1 个返回 401。状态码这一关,多数站是过的。真正难看的是响应体——404 的中位数是 68,678 字节,最大的一个站为了说「没这个页面」发了 1,320,341 字节。
怎么测的
抓取前写死,之后没改。
- 从
http://<站点>起跟随重定向,拿到最终首页,从那里取协议和域名。 - 请求
/querywin-probe-20260818-this-path-does-not-exist一次,浏览器 User-Agent,跟随重定向。 - 记最终状态码、响应体字节数、title,以及正文里有没有
noindex。
每站只测一个杜撰路径,保证它撞不上任何真实地址。没测深层路径,也没测「曾经存在后来删掉」的那一类——而那一类才是线上最常见的来源。
27 个首页给不存在的地址返回了什么
同一个请求,四种答案。只有一种是无聊而正确的那个。
| 状态码 | 站数 | 是哪几个 |
|---|---|---|
| 404 | 23 | 样本主体 |
| 200 | 2 | vercel.com、linear.app |
| 401 | 1 | notion.com |
| 先 308 后 404 | 1 | figma.com |
notion 那个 401 站得住。它同时发了 noindex,整个响应没有一处在邀请收录;一个需要登录的应用对未知路径回 401,是诚实的做法。
返回 200 的那两个站
vercel 和 linear 都对不存在的路径回了成功码,方式还不一样。
vercel 把这个路径导进了登录流程,最后停在 200,页面标题是「Login – Vercel」,响应体 476,961 字节。linear 直接回 200,一个 25,045 字节的空壳,标题就是「Linear」。两个响应都没有任何一处,是爬虫读得懂的「这个页面不存在」。
Google 就是按这个来判的。它的 HTTP 状态码文档里写:If the content suggests an error for Google Search, an empty page or an error message, Search Console will show a soft 404 error.(如果内容看起来是个错误页、空页或错误信息,Search Console 就会报 soft 404。)判据落到内容上,是因为状态码已经不提供信息了。
🔴 前端路由兜底:中文独立站最容易踩的一种
如果你的站是 Vue、React 这类前端渲染的单页应用,删掉一个页面之后,前端路由很可能把任何未知地址都接下来,渲染一个「页面不存在」的界面——而 HTTP 状态码始终是 200。人眼看没问题,爬虫读到的是「这里有内容」。
我们自己就撞见过一次。2026-08-14 那批实测里,一个用单页应用搭的站,/llms.txt 返回的是 200 加一整页 HTML,因为它压根没有这个文件,被前端路由兜住了。同一批里另一个站老老实实 404。AI 爬虫实际读到了什么那篇记的就是这件事。
另一种同源的做法是把不存在的地址 301 到首页。看着比报错友好,代价是爬虫每次都得多跑一跳,而且首页会因为反复被指向而积累一堆无效的入站信号。
状态码对了,账单不一定对
返回正确的码是一个决定,往上挂多大一坨内容是另一个决定。这个样本在第二件事上差得多。
| 站点 | 状态码 | 响应体字节 |
|---|---|---|
| figma.com | 404 | 1,320,341 |
| framer.com | 404 | 1,041,913 |
| wired.com | 404 | 835,108 |
| vercel.com | 200 | 476,961 |
| 全部 404 的中位数 | 404 | 68,678 |
figma 那一条值得一步步看,因为这个形状很常见:我们的请求先拿到一个 308,作用是补一个结尾斜杠;补完之后的地址再返回 404,带着 1,320,341 字节。两次往返、1.3 MB,就为了传达一件事——这儿什么都没有。
soft 404 花掉的是抓取预算
Google 的抓取预算文档点了名:Eliminate soft 404 errors. soft 404 pages will continue to be crawled, and waste your budget.(消灭 soft 404。这类页面会被持续抓取,白白吃掉你的预算。)同一页还有一句管重定向的:Avoid long redirect chains, which have a negative effect on crawling.(避免长重定向链,它对抓取有负面影响。)
两句都是 2026-08-18 在 developers.google.com/crawling/docs/crawl-budget 上读到的。机制是同一个:爬虫愿意花在你身上的请求数是有限的,每一次落到空处的请求,都是一次没花在你真想让它读的页面上的请求。
404 是在告诉爬虫别再问了。不存在的页面回 200,是在告诉它以后每次都来问一遍。
这次抓取回答不了什么
我们每站只编了一个路径。杜撰的地址走的代码分支,未必和真实失效的链接一样——删掉的文章、改过名的产品页、sitemap 里的陈旧条目才是主要来源,这些这次都没测。
我们也不知道这些站在它们自己的 Search Console 里长什么样。soft 404 这个标签是 Google 读完内容之后才给的,别人家的判定结果我们看不到。我们测到的是它的输入,不是它的结论。
今天能做的两件事
两件值得做的,两件值得停的。
- 随手请求一个你确定不存在的地址,用
curl -I看状态码。不是 4xx,问题就已经找到了,不需要任何工具。 - 称一下你的错误页有多重。如果 404 还带着整套站点外壳,砍掉——这个响应只有一个任务。
- 别把不存在的地址跳回首页。那是绕了一圈的同一个毛病,还多花一跳。
- 别指望前端路由去渲染错误状态。状态码在你的代码跑起来之前就定了,而爬虫读的正是那个码。
同一次抓取还产出了另外四组测量。这些首页本身要几跳才到得了,在重定向要跳几次那篇;它们的服务器发不发新鲜度信号,在谁还在发 Last-Modified 那篇。把全站每个页面的状态码都过一遍,而不是只测首页的一个路径,是 QueryWin 正在做的事。
常见问题
你们是怎么测的
每站一次 HTTP 请求,地址是我们编的,浏览器 User-Agent,跟随重定向,2026-08-18 跑完。记最终状态码和响应体字节数。不渲染、不跑 JavaScript、不重试。
soft 404 到底指什么
一个没有内容的地址,返回的却是成功状态码,而不是 404 或 410。Google 靠读页面来判这个标签,不是靠读响应头——因为响应头已经把话说错了。
不存在的页面回 200,真的有害吗
它吃掉的抓取额度,本来会花在你的真页面上,而 Google 自己的文档说这类页面会被持续抓取。至于会不会影响排名,那是另一个论断,这次没测。
删掉的页面该回 404 还是 410
两个都会被理解成「没了」。410 的语气更硬,404 更稳妥——万一以后要恢复。都比 200 强。


