Voss Wang

静态站的 404 页面:状态码比设计重要

2026-10-27 · 部署 / SEO

做 404 页面的时候,大部分精力花在「怎么让它好看、怎么写一句有趣的话」上。但真正会影响站点的是另一件事:这个页面返回的 HTTP 状态码是多少。

三种做法,只有一种是真 404

做法返回状态码搜索引擎看到
平台默认 404404页面不存在,正常移除索引
SPA 回退到 index.html200「这个页面存在,只是内容是首页」
自定义 404.html404页面不存在,正常移除索引

第二种叫「软 404」(soft 404)。它的问题是:任何不存在的 URL 都返回 200 和一份内容,搜索引擎会认为你有无限多个重复页面。轻则浪费抓取配额,重则整站被判低质量。

SPA 之所以这么做,是因为前端路由需要接管 URL——刷新 /user/123 时服务器上没有这个文件,只能回退到 index.html 让前端处理。这是有代价的取舍,不是免费的。

纯静态站没有这个借口。你不存在前端路由,就该老老实实返回 404。

Cloudflare Pages 的规则

Pages 的行为很简单:请求的路径找不到文件时,如果根目录有 404.html,就返回它的内容,状态码是 404。没有就用平台默认页。

不需要配置,不需要 _redirects 规则。放一个 404.html 在根目录就行。

注意两个细节:

  • 文件名必须是 404.html,大小写敏感;
  • 它只在「找不到」时触发,不要试图用它处理别的状态(比如 403)。

怎么验证

别用浏览器——浏览器会自动渲染错误页,你看不到状态码。用命令行:

curl -sI https://tynqueevue.com/this-page-does-not-exist | head -1

预期:

HTTP/2 404

如果返回 HTTP/2 200,说明你的 404 是假的,搜索引擎会把所有错误 URL 当成有效页面收录。

再看一眼内容确实是你的:

curl -s https://tynqueevue.com/this-page-does-not-exist | grep -o '<title>.*</title>'

404 页面该有什么

状态码对了之后,内容其实只有三件事要做:

  1. 说清楚发生了什么——「这个地址不存在」,不要写「哎呀迷路了~」这种让人不确定是不是加载失败的话;
  2. 给一条回去的路——首页链接,或者几个主要栏目;
  3. 如果是改过 URL 的旧文章,给个跳转——这需要 _redirects 文件,属于另一个话题。

不需要搜索框(静态站没后端),不需要「热门文章」(数据是假的),不需要动画。

一个容易忽略的连带问题

改了 URL 结构之后,旧地址会变成 404。如果那个地址已经被收录或者被别人引用过,直接 404 是浪费——应该 301 到新地址。

Cloudflare Pages 支持在根目录放一个 _redirects 文件:

/old-path/  /new-path/  301

一行一条,改完重新部署生效。这个文件不参与构建,只是平台读取的配置。

顺序上,先确认 404 是真 404,再考虑要不要加跳转。反过来做的话,你会分不清「这个 404 是因为没配跳转,还是因为 404 本身就没生效」。


相关:静态站点托管对比 · 只改 NS 的域名迁移