必须返回404状态码;仅展示错误内容而返回200会导致搜索引擎误判为有效页,损害SEO。需用curl -I或Network面板验证响应头为“HTTP/1.1 404 Not Found”,并确保HTML中title含“404”、主内容用、链接用绝对路径且可访问。

404错误不是页面内容问题,而是服务器没返回正确的HTTP状态码和响应头——哪怕你写了“404 - 页面未找到”十个大字,只要响应头是HTTP/1.1 200 OK,搜索引擎就当它是首页收录,用户刷新也得不到重试提示。
怎么确认你的404页面真返回了404状态码
别信页面文字,只信响应头。打开浏览器开发者工具的Network面板,刷新一个不存在的路径(比如/nonexistent),点开该请求,看Response Headers里有没有Status: 404 Not Found;或者用命令行验证:
curl -I https://yoursite.com/nonexistent
常见误判点:
- 单页应用(SPA)路由兜底页(如
createBrowserRouter里的errorElement)本质仍是200响应,不算真404 - GitHub Pages 的
/404.html会自动返回404,但/foo/404.html不会——它只认根目录下命名准确、无子路径的文件 - Nginx 配置了
error_page 404 /404.html,却忘了在location = /404.html里加internal;,导致外部可直接访问/404.html并返回200
静态托管平台(GitHub Pages / Netlify / Vercel)怎么配才生效
各平台对“自定义404”的支持逻辑不同,不能套用同一套配置:
立即学习“前端免费学习笔记(深入)”;
- GitHub Pages:必须把文件命名为
404.html,放在仓库根目录,且不能有任何前缀(如pages/404.html无效);不支持设置其他状态码或重定向 - Netlify:需在
_redirects文件中写/* /404.html 404,或在netlify.toml中配置[[redirects]] from = "/*" to = "/404.html" status = 404 - Vercel:必须启用
staticPageGeneration,并在vercel.json中用"errorPages": {"404": "/404.html"};仅靠rewrites无法改变状态码
所有平台都不允许你在404.html里用<meta http-equiv="refresh">跳转——这会让响应变成200,且对屏幕阅读器不友好。
后端(Express / Flask / Django)如何显式返回404
不能只渲染HTML,必须手动设置状态码。漏掉这一步,等于没做:
- Express:
res.status(404).sendFile(path.join(__dirname, '404.html')),别用res.sendFile()单独调用(默认200) - Flask:
return send_file('404.html'), 404或更稳妥地用abort(404)触发全局错误处理器 - Django:在视图中
return HttpResponseNotFound(render_to_string('404.html'));确保DEBUG=False时ALLOWED_HOSTS已配置,否则连404页都加载不出来
注意:Django 的 static 文件必须走{% static %}标签引用,不能用相对路径,否则/static/xxx.png本身404会触发二次失败请求。
404页面自身资源加载失败(图片/CSS/JS 404)怎么办
404页面出错时,最不该再触发额外404——比如<img src="icon.png" alt="HTML 404错误处理教程" >失败,会导致白屏或布局崩坏:
- CSS 必须内联:
<style>body{font-family:-apple-system,BlinkMacSystemFont,...}</style>,禁用<link rel="stylesheet"> - 图标优先用 SVG 内联:
<svg viewbox="0 0 100 100"><circle cx="50" cy="50" r="40"></circle></svg>,避免<img src="404-icon.svg" alt="HTML 404错误处理教程" > - 字体用系统栈,不引入 Google Fonts 等外部请求
- JavaScript 可保留(如搜索框提交),但不能依赖
fetch或localStorage等可能失败的API;history.back()慎用——从外链进来的用户点它会跳到about:blank
最容易被忽略的是:<title></title>里必须含404字样,否则用户从搜索引擎点进来,根本分不清这是错误页还是首页。



















