静态站的 404 页面:状态码比设计重要
2026-10-27 · 部署 / SEO
做 404 页面的时候,大部分精力花在「怎么让它好看、怎么写一句有趣的话」上。但真正会影响站点的是另一件事:这个页面返回的 HTTP 状态码是多少。
三种做法,只有一种是真 404
| 做法 | 返回状态码 | 搜索引擎看到 |
|---|---|---|
| 平台默认 404 | 404 | 页面不存在,正常移除索引 |
| SPA 回退到 index.html | 200 | 「这个页面存在,只是内容是首页」 |
| 自定义 404.html | 404 | 页面不存在,正常移除索引 |
第二种叫「软 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 页面该有什么
状态码对了之后,内容其实只有三件事要做:
- 说清楚发生了什么——「这个地址不存在」,不要写「哎呀迷路了~」这种让人不确定是不是加载失败的话;
- 给一条回去的路——首页链接,或者几个主要栏目;
- 如果是改过 URL 的旧文章,给个跳转——这需要
_redirects文件,属于另一个话题。
不需要搜索框(静态站没后端),不需要「热门文章」(数据是假的),不需要动画。
一个容易忽略的连带问题
改了 URL 结构之后,旧地址会变成 404。如果那个地址已经被收录或者被别人引用过,直接 404 是浪费——应该 301 到新地址。
Cloudflare Pages 支持在根目录放一个 _redirects 文件:
/old-path/ /new-path/ 301
一行一条,改完重新部署生效。这个文件不参与构建,只是平台读取的配置。
顺序上,先确认 404 是真 404,再考虑要不要加跳转。反过来做的话,你会分不清「这个 404 是因为没配跳转,还是因为 404 本身就没生效」。
相关:静态站点托管对比 · 只改 NS 的域名迁移