在访客之前找到死链

你网站上的每个死链都会被人发现。唯一的问题是,发现者是你——在一个安静的下午运行一次检查,还是购物到一半的访客、顺着你文档里的链接找来的客户,或正在决定你页面价值的搜索引擎爬虫。链接是悄悄腐烂的——页面搬家、域名更换、图片改名、合作伙伴改组——而页面本身不会宣布这种衰败。本文讲何时运行死链检查、它报告的状态到底是什么意思、按什么顺序修它找到的问题,以及一次查一个页面这一做法诚实的限度。

何时运行死链检查

价值最高的时刻,是 URL 成批变化的时刻。改版之后,模板被重建、导航被重写,一个正确多年的链接可能悄悄指向新设计不再提供的路径。迁移之后——新 CMS、新平台、新 URL 结构——每个内部链接实际上都是对内容所在位置的一次新声称,其中一些声称会是错的。更换域名之后,旧地址、合作伙伴链接和嵌入图片全都依赖有人记得写的重定向。把检查作为上线的一部分来跑,而不是等第一次投诉之后。

安静的时刻同样重要。删除或合并内容会让每个指向它的链接成为孤儿;改动媒体库或图片命名规则会在无人记得那次改动几个月后弄坏图片;而其他网站改组时不会通知你,所以发布时可用的外部链接会按它们自己的时间表衰败。一个合理的节奏是:每次结构变更后检查主页和关键落地页,再加上定期巡查——对大多数网站每月一次足够——覆盖你的访客和搜索引擎真正在用的页面。本站的死链检查器一次查一个页面,正契合这个节奏:要紧的页面,被刻意地检查。

这些状态到底是什么意思

链接检查可以归结为每个链接一个问题:跟随这个链接时,服务器如何应答?正常意味着直接成功(2xx)。重定向意味着链接要经过一次或多次 3xx 跳转才通——今天没问题,但每一跳都是一个必须有人兑现的承诺。损坏意味着 4xx 应答,最常见的是 404 未找到:承诺的页面不在那里。服务器错误意味着 5xx 应答:页面可能存在,但它的服务器没能交付它。超时和不可达意味着根本没有可用的应答到达——慢、主机已死、DNS 失败。而已跳过意味着检查器刻意没有抓取该目标,因为它解析到私有或被屏蔽的地址。

搜索引擎读的是同样的应答。Google 自己关于 HTTP 状态码如何影响其爬虫的文档说:2xx 响应让内容可被考虑收录;爬虫会跟随重定向(默认最多 10 跳),并把最终目标当作真正算数的页面;返回 4xx 的 URL 不会被收录——若曾被收录则会被移出索引——而持续的 5xx 错误会拖慢爬取,并最终也可能导致页面被丢弃。这就是为什么内部死链不只是外观瑕疵:爬虫跟过去,什么也没得到,链接的价值和目标在索引中的位置一起蒸发。

按这个顺序修:内部 404、重定向链、图片

先修内部 404。指向你自己网站的死链完全在你的掌控之中,它挡在你已经赢得的访客面前,还告诉爬虫:一个你链接过去的——想必因为重要——页面并不存在。在源头修它:页面是误删的就恢复它,URL 漂移了就改正它,或把链接指向真正替代旧页面的那个页面。重定向留给那些可能被外人收藏或链接的地址;你自己页面上的链接就应该直接是对的。

重定向链第二。搬家后一次重定向是正常的。链——旧 URL 重定向到较新的 URL、再重定向到当前的 URL——让每次点击多付一趟往返的代价,而且每一跳都是另一条可能在下一次迁移中丢失的规则。把链接本身更新为最终地址;需要看清跳数时,HTTP 状态链追踪器会把它们逐跳列出。图片第三。损坏的图片很少妨碍页面的阅读,所以它排在前两项之后——但还是要修:恢复文件、改正路径或删掉标签,因为满是缺图框的页面读起来像被遗弃了,而且有时那张“图片”其实是正文依赖的图表或产品照片。

一次一个页面——以及为什么这个范围是诚实的

与本文配套的检查器每次运行检查一个页面、其上最多 300 个链接,并在页面上明说。这一范围是一种刻意的取舍。单个页面可以被足够快地抓取、解析和完整检查,从而成为编辑—发布循环的一部分:改页面、跑检查、修它找到的问题、发布。它也让账目精确——找到多少链接、检查了多少、多少被列出但从未抓取(mailto:、tel: 和页内片段不是 HTTP 请求,因此如实报告,而不是套上编造的状态),并且每当一次运行在覆盖全部之前停下,结果都标注为部分结果,而不是把默默的截断打扮成完整。

全站发现是另一件工作、用另一些工具:你的 CMS 知道你发布的每个页面,你的服务器日志显示真实访客和爬虫已经撞上的每个 404,Search Console 报告 Google 本人遇到的错误。用它们来决定哪些页面值得检查,然后逐个检查并修你找到的问题。单页检查器绝不能做的,是假装自己是一次爬取;而你绝不能做的,是因为没有全站工具就连那几个承载你流量的页面也不查。

让它成为习惯,而不是事件

死链最少的网站,不是做年度大扫除做得最大的那些,而是把检查附着在变更上的那些。每当 URL 结构、模板、菜单或媒体文件夹变化时,向外链接的页面在变更被认为完成之前都要过一次检查。每当内容被删除时,“什么链接到了这里?”这个问题要在答案还容易时被问出来。这个习惯每次变更只花几分钟,却能避免日后对一份上千链接报告做考古。

而当一次检查确实发现损坏时,修链接,而不只是修症状:更新源页面,如果外部世界在用旧地址就为它保留一条干净的重定向,然后对同一页面再跑一次,亲眼看着判定改变。死链是少数完全可以用机械方式检出、且完全在你的能力范围内修复的网站问题之一——唯一的真正失败模式,是通过一位先找到它的访客,第二个得知它。

来源与延伸阅读

常见问题

我应该多久检查一次死链?

每次结构变更之后——改版、迁移、换域名、成批删除——无一例外;其余时候保持一个轻量的定期节奏:对大多数网站来说,每月检查主页和访问量最高的页面就足够了。链接既因你自己的变更、也因他人的变更而衰败,所以日历式的巡查能抓住事件驱动检查漏掉的东西。

死链会伤害 SEO 吗?

内部死链浪费了该链接本应传递的价值,并把爬虫送进死胡同;按 Google 的文档,返回 4xx 的 URL 不会被收录,若曾被收录则会被移出索引,而持续的 5xx 错误会减少爬取。偶尔的外部链接死亡是正常的网络衰败,不是紧急事件——修那些在要紧页面上的,从你自己的内部 404 开始。

我应该把每个死链都重定向到主页吗?

不应该。把搬走的页面重定向到它真正的替代页面——跟随旧链接的访客真正想要的那个页面。把一切都送到主页会把访客困在一个无关的地方,还可能被搜索引擎读作软 404。如果确实没有什么能替代旧页面,诚实的 404 好过误导性的重定向。