最可靠方案是将404.html放根目录并配置服务器返回真实404状态码;Apache用ErrorDocument,Nginx用error_page,Vercel/Netlify自动识别但需命名规范,GitHub Pages仅支持根目录404.html且Jekyll需禁用渲染。

直接放一个 404.html 文件到网站根目录,再配好服务器返回真实 404 状态码——这是唯一既对用户友好、又对搜索引擎有效的做法。光有页面没配置,浏览器看到的只是个普通 HTML,HTTP 状态码很可能是 200 或跳转型的 302,SEO 会认为内容还在,甚至把权重错配给首页。
为什么不能只放文件不配服务器?
很多新手双击打开 404.html 看着正常,就以为搞定了。但本地双击走的是 file:// 协议,根本没经过服务器,压根不触发 HTTP 状态码逻辑。真实场景中,用户访问 /nonexistent 时,必须由服务器明确返回 404 Not Found 响应头,同时响应体是你的 HTML 内容。否则:
- Google 会抓取到
200 OK页面,当成有效内容索引 - 爬虫无法识别这是错误页,不会清理死链
- 用户从搜索结果点进来,可能误以为页面“迁移到了 404 页”
Apache / Nginx 必须加的配置行
配置目标只有一个:让所有 404 请求返回你的文件,且不跳转、不改状态码。
- Apache:
ErrorDocument 404 /404.html(写进.htaccess或虚拟主机配置,路径必须以/开头) - Nginx:
error_page 404 /404.html;,并确保有location = /404.html { }块允许直接访问该文件 - Vercel / Netlify:默认识别根目录
404.html,但文件名必须严格为小写、无空格、无额外扩展名(如不能叫404.htm) - GitHub Pages:只认根目录
404.html;若用 Jekyll,需在文件头部加permalink: /404.html和published: false防止被渲染
404.html 里最容易踩的三个坑
页面本身看似简单,但三处细节错一点,就等于白做:
立即学习“前端免费学习笔记(深入)”;
- 别用
<meta http-equiv="refresh" content="0;url=/">—— 这会让状态码变成200,不是404 - 别在 JS 里自动执行
window.location.href = '/'—— 爬虫和禁用 JS 的用户收不到 404 语义 -
<title>和主<h1>必须含 “404” 或 “Not Found”,否则屏幕阅读器和 Google 不知道这是错误页
真正有用的导航只有两个:一个清晰的「返回首页」链接(href="/"),一个基于 document.referrer 判断同域后生成的「回到上一页」按钮。其他按钮、搜索框、栏目列表,反而延长用户离开时间。



















