返回知识库

数据与服务 · 网络与接口

资源不存在404 Not Found

404 Not Found 的意思是服务器找不到这个资源:路由匹配了,但资源查无。它不是服务出错(5xx)、不是请求格式错(400)、也不是永久删除(410);对私有资源无权访问时也统一返 404,避免泄露存在性。前端拿到 404 应展示空状态并给返回入口。

该返哪个码?404 的边界判定台

404 最容易和 200、400、403、410 混。下面五条请求每条隔离一个边界,你选一个该返回的码,选错会即时告诉你「应为哪个、为什么」。

你来当服务器。读每条请求的情境,选一个该返回的状态码——选对,工单盖上对应章;选错,会即时告诉你「应为哪个码、为什么」。

  1. GET/users/421/5

    用户 42 存在,且在公开目录里,谁都能看。

  2. GET/users/99992/5

    数据库里没有 id=9999 的用户,从未存在过。

  3. GET/invoices/20243/5

    发票 2024 存在,但属于他人的私有账户,当前用户无权查看。

  4. GET/posts/summer-sale4/5

    这篇文章曾经存在,上周被作者永久删除并归档,希望「别再被访问」。

  5. GET/users/abc5/5

    路由要求 /users/:id 为数字,abc 不是合法 id。

已判定 0/5:每条请求选一个状态码,选错会即时告诉你边界在哪。

404 的四条边界:和它的邻居区分

判定台里的每张工单都在说一条边界。把它们并到一张表,离开页面后也能照着分流。

看到这个信号返回为什么是这个码
资源查无 · 路由未注册404找不到这个资源,前端给空状态 + 返回入口。
曾经有、被永久删除410明确「它有过、现在永久没了」,客户端和爬虫据此清理。
私有资源、无权访问404不返 403,避免泄露「它存在」、被枚举。
请求参数格式错400格式就不对,连「查资源」都到不了。
服务端异常 / 上游故障5xx责任在服务端,不是「找不到」。
业务规则不满足(已下架等)409/422资源在、但状态不允许,不是找不到。

一句话:404 是「找不到这个资源」。它不说「出错了」(那是 5xx)、不说「请求格式错」(那是 400)、也不说「永久删了」(那是 410);对私有资源,它还要假装「找不到」以保护存在性。

什么时候返 404(和不返)

看到下面这些信号再返 404;看到右边的症状请换码,别拿 404 当万能兜底。

  • 返 404路由匹配但公开资源查无;或路径本身就没注册(/api/拼错的段)。
  • 也返 404(安全)私有资源、当前用户无权访问——对外统一「找不到」,避免 403 泄露存在性。
  • 别返 404服务端异常、数据库连接断、上游超时——这是 5xx,伪装成 404 会掩盖真故障。
  • 别返 404业务规则不满足(商品已下架、名额已满)——资源在、只是状态不允许,用 409/422 或业务状态码。
  • 别用 200 + {found:false}破坏 HTTP 语义,缓存/监控/重试全部失效,前端得逐接口手写判断。

从请求走到空状态

一条请求进了服务器,到前端拿到 404 并切到空状态,最短路径是这四步。

  1. 匹配路由确认方法和路径进入预期 handler;路径本身没注册也会落到 404。
  2. 查找资源查数据库 / 上游;把「查无」和「异常」分开记录,别把故障包装成 404。
  3. 返回 404路由未注册或公开资源查无 → 返 404;私有资源无权也统一 404。
  4. 前端空状态拿到 404 → 展示「这里什么都没有」+ 返回首页/列表入口,别白屏或抛原始错。

列表分页超出范围(如第 99 页)也常返 404,或返回空数组——前者表达「这页不存在」,后者方便前端直接渲染空状态,按团队约定统一即可。

正反例:找不到,该怎么返

同一个「查无此用户」,返回 404 还是 200/403,决定了前端、网关和安全能不能各司其职。

正例404 + 空状态
GET /users/9999 → 404 Not Found

前端按 4xx 知道是「找不到」,切到空状态「这里什么都没有」并给返回列表入口;监控不会误报故障。

反例 1200 + {found:false}
GET /users/9999 → 200 OK {found:false}

HTTP 层看到的是成功:CDN 照样缓存、告警不响、重试逻辑不触发;前端必须逐接口手写「if found」,一旦有人漏判就白屏。

反例 2403 泄露存在性
GET /invoices/2024(私有)→ 403 Forbidden

对私有资源返 403,等于告诉攻击者「2024 这个 id 是真的、只是你没权限」;攻击者据此枚举 id,再把 404 的剔除。私有无权应统一返 404。

快速自测

管理员把一个商品页「永久下线」,希望搜索引擎和缓存别再访问它,该返哪个状态码最合适?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。