本文约 3,142 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:页面上写着”页面不存在”,HTTP 状态码却是 200
打开一个不存在的地址,浏览器里显示”抱歉,您访问的页面不存在”,看起来一切正常。但用开发者工具一看,这个请求的 HTTP 状态码是 200 OK。这意味着百度会把它当成”一个内容很少的正常页面”收录进索引,随后在搜索结果里出现一个标题为”页面不存在”的结果。这种情况就是软 404,它比硬 404 更难清理,因为百度没有收到任何”这个页面不存在”的信号。
原理分析:404、410、200 分别告诉百度什么
| 状态码 | 含义 | 百度行为 | 适用场景 |
|---|---|---|---|
| 404 | 资源不存在 | 从索引中移除 | 页面被删除且无替代 |
| 410 | 资源已永久消失 | 比 404 更快移除 | 确认永不恢复的内容 |
| 200 | 正常 | 正常收录 | — |
| 200 + “不存在”文案 | 软 404 | 可能被收录为低质页 | 应当避免 |
| 301/302 | 临时/永久跳转 | 转移权重到新地址 | 有替代页面时 |
判断软 404 的核心标准:HTTP 响应头的状态码与页面实际内容是否一致。内容说”不存在”但状态码是 200,就是软 404。百度会通过内容特征辅助识别软 404,但识别并不总是成功,所以最好的做法是让服务端直接返回正确的状态码。
404 与 410 的选择:大多数情况用 404 即可;如果确认这批内容永久删除且希望尽快从索引中移除(比如违规内容、已下线产品),可以用 410。注意 410 是不可逆信号,误用会丢失已有权重。
有替代页面时不要用 404。文章换了地址就该 301;页面被合并进另一个页面也该 301。把有替代内容的删除页返回 404,等于主动丢弃累积的权重和外链。
保姆级实操
步骤1:检查站点当前的软 404
用 curl 看响应头,这是最直接的验证方式:
# 查看一个不存在 URL 实际返回的状态码
curl -I https://mimangfei.com/this-page-does-not-exist-12345/
# 期望输出首行:HTTP/2 404
步骤2:确认 Nginx 配置正确
WordPress 的 404 由 PHP 层输出,前提是 Nginx 把请求正确交给 index.php 而不是自行返回:
# Nginx:保证未知路径交给 WordPress 处理,不要在这里强制返回 200
location / {
try_files $uri $uri/ /index.php?$args;
}
# 静态资源找不到时直接返回 404,且不套用 404 页面
location ~* \.(js|css|png|jpg|jpeg|gif|webp|svg|woff2)$ {
try_files $uri =404;
expires 30d;
access_log off;
}
步骤3:确认 WordPress 真的输出 404
某些主题或插件会拦截 404(比如把未匹配路径重定向到首页),需要检查。可以用代码强制校正:
// functions.php:确保查询无结果时返回真正的 404 状态码
add_action( 'template_redirect', function() {
if ( is_404() ) {
status_header( 404 );
nocache_headers();
}
} );
步骤4:制作 404.php 模板
WordPress 的模板层级支持 404.php,主题里没有就用 index.php,此时最容易输出 200。新建一个规范的 404 模板:
<?php
/**
* 404 模板
* 注意:不要用 wp_redirect 跳回首页,否则状态码会变成 302
*/
get_header();
?>
<main class="error-404">
<h1>页面不存在(404)</h1>
<p>这个地址可能已经变更或被删除,你可以:</p>
<ul>
<li><a href="<?php echo esc_url( home_url( '/' ) ); ?>">返回首页</a></li>
<li>使用站内搜索查找相关内容</li>
<li>浏览下方最近更新的文章</li>
</ul>
<?php get_search_form(); ?>
</main>
<?php
get_footer();
步骤5:给 404 页加有用内容
推荐元素:搜索框、返回首页链接、5–10 条最近更新或热门文章链接。不要只有一句”页面不存在”。
步骤6:不要用 JS 跳转回首页
用 window.location 或 meta refresh 跳转,服务端状态码仍是 200/302,等于变相软 404。需要跳转就用 301,改版场景的规则提交见 改版工具URL变更使用方法。
步骤7:处理已收录的软 404
在搜索资源平台查看”抓取异常”和索引中的软 404 页面,修正状态码后提交死链,流程参考 死链检测与提交。
步骤8:区分静态资源与页面的 404
图片、CSS 缺失时应当直接返回 404 并关闭日志,不要渲染一个 HTML 404 页面,否则会造成资源浪费和额外的错误解析。
常见踩坑
- 404 页用 wp_redirect 跳首页:状态码变成 302,所有不存在的 URL 都变成”跳转到首页”,产生海量重复内容。
- 主题缺少 404.php:回落到 index.php,查询为空但仍返回 200。
- Nginx 用
error_page 404 =200 /404.html:显式把 404 改成 200,制造全站软 404。 - 404 页被 robots 允许但被 sitemap 收录:需要检查 sitemap 是否包含不存在的 URL。
- 案例:某站点为了”不让用户看到冷冰冰的 404″,把 404 模板改成了 3 秒后自动跳首页的 meta refresh。半年后索引里出现了数百个标题为”首页”的重复结果,且这些 URL 都是曾经存在过的旧文章地址。整改时去掉跳转、补上真实的 404 模板与状态码,再配合死链提交,两个月才清理干净。
- 用 404 处理有替代内容的页面:旧文章有新地址却返回 404,白白损失权重。
- 忽略 HTTPS/HTTP 与带 www/不带 www 的差异:不同主机头的 404 表现可能不同,需要分别验证。
总结
404 的正确标准只有一句:不存在的页面必须返回 404 或 410 状态码,同时给用户一个有用的页面。操作上分三步:用 curl 验证状态码、确认 Nginx 不把 404 改写成 200、给主题补上规范的 404.php 并禁止任何形式的自动跳转。确认有替代内容的删除页一律走 301,只有真正无替代时才用 404。修完之后,用搜索资源平台的抓取异常数据核对,软 404 的数量应当逐渐下降。404 处理与 canonical正确用法 是处理”页面失效”问题的两种互补手段:有替代用 canonical 或 301,无替代用 404。
