必须返回404 Not Found状态码,而非200或302;Apache用ErrorDocument 404 /404.html配置,路径须以/开头,文件≥512字节,禁用跳转,用curl -I验证响应头。

404 错误页面必须返回 404 Not Found 状态码,而不是跳转后返回 200 OK 或 302 Found——否则搜索引擎会判定为“软404”,不清理死链,还可能降权。
Apache 中用 ErrorDocument 配置真实 404 页面
这是最常见也最容易出错的方式。关键不是“让页面好看”,而是确保状态码没被悄悄覆盖。
-
ErrorDocument 404 /404.html这行必须写在.htaccess或虚拟主机配置里,路径以/开头(不能是404.html或完整 URL) -
404.html文件必须放在网站根目录,且内容 ≥512 字节(避免被 IE/旧浏览器当成“简陋错误页”而自动替换) - 别在
404.html里写或window.location.href跳转——这会让响应变成200,且对屏幕阅读器不友好 - 验证方式:终端执行
curl -I https://yoursite.com/nonexistent,第一行必须是HTTP/1.1 404 Not Found,且响应体是你写的 HTML 内容
Nginx 中用 error_page 返回自定义页面
Nginx 默认不拦截后端返回的 404,必须显式配置才能接管;直接写 return 301 是重定向,不是 404 页面。
- 正确做法是:
error_page 404 /404.html,再配一个location = /404.html { root /usr/share/nginx/html; internal; } -
internal很关键:防止用户直接访问/404.html,只允许服务器内部跳转时触发 - 如果后端是反向代理(如 PHP-FPM 或 Node.js),需加
proxy_intercept_errors on;,否则上游返回的 404 不会被 nginx 捕获 - 静态资源场景常用
try_files $uri $uri/ /404.html;,但注意它只对location /生效,不适用于子路径嵌套
GitHub Pages / Netlify 等静态托管平台的特殊处理
它们不运行 Apache/Nginx,配置逻辑完全不同;照搬服务器规则会失效。
- GitHub Pages:只需把
404.html放在仓库根目录,文件名必须是小写、全角无空格,且路径为/404.html(不是/errors/404.html) - Netlify:需在
_redirects文件中写/* /404.html 404,或在netlify.toml中声明[[redirects]] from = "/*" to = "/404.html" status = 404 - Vue/React SPA 部署时,
404.html里要内嵌 JS 做 URL 重写(如把/about改成/?/about),否则刷新深层路由仍报 404 - 所有静态托管都禁用外部请求:CSS/JS 必须内联,图片优先用 SVG 或 data URI,避免因资源 404 导致页面白屏
后端框架(如 Express、CodeIgniter)中显式设置状态码
模板渲染再漂亮,如果没设 status(404),就只是个普通 200 页面。
- Express:必须写
res.status(404).sendFile(path.join(__dirname, '404.html')),不能只写res.sendFile(...) - CodeIgniter:靠
$route['404_override'] = 'Errors/page404';拦截,然后在控制器方法里调用show_404()或手动set_status_header(404) - Django:用
return HttpResponseNotFound(render(request, '404.html')),不能只render - PHP 原生:在输出前加
http_response_code(404);,且必须在任何echo或header()之前调用
最容易被忽略的是:404 页面本身不能依赖外部资源加载,也不能靠 JS 跳转来“补救”——它得在第一次 HTTP 响应里就完整、合法、可访问。状态码错了,其他都白搭。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











