郭立 (leeguoo)

# 删了一篇文章,它却在 Google 里阴魂不散:一个跳转把死链焊住了

删掉博客一篇旧文,zh 版是干净的 404,但 en/ja 地址还 302 跳到那个已经 404 的 zh 页,Google 一直把它们留在索引里。根因不是没删干净,是一个多语言回退跳转只信"任务表"、不核实源页面是否还活着,把死链焊在了搜索引擎里。这篇复盘症状、排查、根因和小修复,以及两条关于删除和重定向的教训。

2026年7月2日 · 文章 · 公开

本页目录

前几天清理博客,删了一篇不该公开的旧文。zh 版删完,直接访问是干净的 404,我以为这事就结了。结果它在 Google 里赖着不走,en 和 ja 的地址点进去也还"活着"。删都删了,怎么还删不掉?

翻到根因之后有点哭笑不得:不是没删干净,是一个多语言跳转把这条死链在了搜索引擎里。记下来,因为这类"僵尸 URL"很容易踩,症状还带迷惑性。

删了内容变成 404 墓碑,但 302 跳转路牌还在把人送向死胡同;修复是在跳转前先设一个检查站,确认落点还活着再决定跳还是直接 404

症状:zh 是 404,en/ja 却 302

这个博客是三语的,一篇文章有 zh / en / ja 三个地址。删掉的是 zh 版,curl 一遍:

zh  → 404                          (没了,对)
en  → 302 → /zh/posts/<slug>/      (跳到刚删掉的 zh)
ja  → 302 → /zh/posts/<slug>/

en / ja 的地址还在,而且会 302 跳到那个已经 404 的 zh 页。用户点进来的体验是"转一下,然后 404";Google 看到的是"这俩 URL 还在,只是重定向了",于是继续把它们留在索引里。内容删了,壳没删干净。

排查:是通用规则,还是这条特有的?

先要分清一件事:是不是所有 /en/posts/* 都会往 /zh/ 跳?如果是通用回退规则,那不过是"死链跳死链",无所谓。我拿一个根本不存在的 slug 试:

en/一个纯粹不存在的-slug   → 404
en/<这篇的-slug>           → 302 → zh

差别出来了:随便编的 slug 直接 404,唯独这篇的 en 会 302。说明不是通用规则,是这条特定路径上残留了一份记录,在指挥它往 zh 跳。

再确认内容层是不是真删了:通过发布 API 下载这篇的三个语言版本,全部报"找不到";sitemap 里也搜不到。内容确实没了。问题锁定在了别处:跳转记录活得比内容久。

根因:跳转只信"任务表",不核实内容还在不在

这个博客的多语言逻辑是"缺哪个语言,就回退到有的那个"。渲染 /en/posts/<slug> 时,如果 en 版不存在,worker 会去查一张本地化任务表(记着"这篇源语言是 zh,要翻成 en/ja"),查到源是 zh,就 302 跳到 /zh/posts/<slug>

问题就在这:它信了任务表里"源是 zh"这条记录,却没去核实那个 zh 页现在是否还活着。删 zh 内容的时候,这条本地化任务记录没被一起清掉。于是源没了、记录还在,跳转照跳,一路 302 到一个 404。

一句话概括这个 bug:跳转指向的是"内容应该在的地方",而不是"内容实际在的地方"。内容一删或一挪,这种跳转就变成了焊死的死链。

修复:跳之前,先确认落点是活的

改法很小,方向很明确:在决定 302 之前,先查一下要跳过去的那个源页面是不是真的还 published、没私有、没删。我加了个 isPublishedPostLive() 守卫:

源页面还 live?   是 → 照旧 302 过去(正常的三语回退)
                 否 → 返回 404(别把用户和爬虫送进死胡同)

部署后再 curl,en / ja 都乖乖 404 了;而正常的、源还在的三语回退一点没受影响(特意拿另一篇只有 zh 版的文章验过,它的 en 照常 302,没误伤)。

两条能带走的教训

一,301/302 到 404,比直接 404 更糟。 直接 404 是在告诉 Google"这没了,删索引吧";而"重定向到一个 404",Google 会把那个会重定向的 URL 继续留着观察,死链反而更黏。要让一个页面彻底消失,让它自己干脆地 404 或 410,别用一层跳转去"优雅处理"。

二,删除要级联到所有派生物。 一篇内容删掉,牵着它的东西不止正文:重定向记录、本地化配对、sitemap 条目、缓存。少清一样,就多一个僵尸 URL 的入口。我这个坑就是本地化任务表这一样没跟着删。写删除逻辑时清单要列全;更稳的兜底,是像这个修复一样,让任何"跳转/引用"在用之前先验证落点还活着,而不是假设它一定在。

删东西比想象的难。真正删干净的标准不是"主记录没了",是顺着它能到达的每一条路,都到不了了。

← 上一篇
如何做好一个 AI 女友
下一篇 →
一个真实 Chrome,几个 agent,还有你自己:怎么不互相点乱

评论

评论发布后会立即公开,如触发规则可能被审核下架。

最多 1000 字。