站长大都做过这样的事:换友情链接的时候随手点了一下对方的站,发现能打开,就换上了;半年后偶然用工具扫一遍,才发现首页导出的几十个外链里,有六七个已经是「域名过期待售」的停放页,还有一个跳到了纯广告站。这一类问题不会让你的排名立刻掉下去,但它确实在持续消耗你页面传递出去的权重,而且会让搜索引擎对页面的「质量认知」打折扣。
外链管理和很多人理解的相反:重点不是去发外链,而是定期审计你自己页面上导出的链接。本文讲的是一套可以月度执行的审计流程,包括怎么发现坏链、怎么分类、怎么决定 nofollow 还是删除、以及 Disavow 到底该不该用。
一、先分清三种「外链」,处理方式完全不同
说「外链」的时候,很多人指的是三件不同的事,混淆会导致处理方向完全错位:
- 出站链接:你的页面里指向别人网站的链接。这是本文重点,你能完全控制。
- 入站链接:别人的页面指向你。只有删除请求和 Disavow 两种手段,而且后者主要针对垃圾外链。
- 站内链接:自己的页面互相连。属于内链结构,不在本文范围。
出站链接的审计之所以重要,是因为它是你唯一能百分百负责的部分。搜索引擎判断一个页面是否可信时,会看它指向哪里——大量指向低质量站点的页面,很难被当作「有参考价值的资料页」。
二、把全站出站链接导出来
不用装昂贵的工具,一个小脚本就能把全站外链抓全。前提是你有站点地图(sitemap)或者能列出所有文章 URL:
#!/bin/bash
# 用法:./scan_outbound.sh urls.txt
while read -r url; do
html=$(curl -sL --max-time 15 "$url")
printf '%s' "$html" \
| grep -oE 'href="https?://[^"]+"' \
| sed 's/href="//;s/"$//' \
| grep -vE 'zz1984[.]com' \
| while read -r link; do
echo -e "$url\t$link"
done
done < urls.txt > outbound.tsv要点在于 `grep -vE` 要把自己的域名排除掉,正则里用 `[.]` 而不是转义点号,避免 shell 转义歧义。跑完得到一张两列的 TSV:来源页、目标链接。
接着按域名聚合,看哪些域名出现得最多——这些就是最需要优先审计的:
cut -f2 outbound.tsv | awk -F/ '{print $3}' | sort | uniq -c | sort -rn | head -30三、批量检查链接是否还活着
拿到链接列表后要做的是「状态检查」,不是「内容检查」。状态检查只需要发 HEAD 请求,比下载整个页面快得多:
#!/bin/bash
while read -r link; do
code=$(curl -s -o /dev/null -w '%{http_code}' -L --max-time 10 \
-A 'Mozilla/5.0 (compatible; LinkAudit/1.0)' "$link")
echo -e "$code\t$link"
done < links.txt > status.tsv结果要按状态码分成四类处理,每一类的含义完全不同:
- 200:正常。但 200 不代表内容还在,停放页也是 200,需要第二步内容判断。
- 301 / 302:检查最终落点是不是原站。如果跳到了完全无关的域名,视为失效。
- 403 / 429:多半是对方防爬。这类不要直接判死,人工点开看一眼再决定。批量脚本最容易在这一类上误伤好链接。
- 404 / 410:确实没了。404 处理成删除,410 表示对方已明确移除,同样删除或替换。
还有一个常被忽略的类型:域名已过期但服务器仍返回 200 的停放页。特征是页面标题里带「待售」「此域名可出售」「parked」之类,正文通常只有一段广告。判据可以这样写:
body=$(curl -sL --max-time 10 "$link")
printf '%s' "$body" | grep -qiE '域名.*(出售|转让)|domain.*(for sale|parked)|this domain is parked' \
&& echo "PARKED $link"四、内容相关性:200 也可能不该留
链接还活着,不代表它值得留。第二层判断是内容是否还和你的页面主题相关。这一步无法全自动,但可以批量缩小范围:抓回目标页面的标题标签(<title>)和一级标题,和你的页面标题做一次肉眼比对。
实际操作中按三档处理就够了:
- 强相关:同主题的技术博客、官方文档、开源项目主页。保留,而且最好确认链接文字准确描述了目标内容。
- 弱相关:同类但不同领域,或内容已大幅改版。可以保留但加 `nofollow`,或者替换成更贴切的链接。
- 不相关或已变质:原来的技术博客变成了博彩、贷款、下载站,或者原域名被别的业务接管。这类必须处理,优先删除或替换。
第三种情况在个人站里其实很常见。一个 2019 年的技术贴换了一个现在看起来还行的域名,几年后域名到期被抢注,变成导流页——这就是为什么审计要定期做,而不是一次性做。
五、四种处理手段,用哪个
发现一条有问题的外链,有四种处理方式。选择顺序从强到弱是:
一、替换。这是最好的处理。原链接死了,但那段话还需要一个出处,就找一个内容等价的新链接替上去。既能修复问题,又不损失页面的完整性。判断标准是「这段话少了引用还成不成立」,不成立就该替换。
二、删除。适合那些纯粹是「顺便提一句」的链接,删掉不影响语义。删的时候注意整句是否还通顺,别留下「可以参考这里」却没有链接的断句。
三、加 nofollow。适合内容仍需保留、但不想给权重的场景。写法是:
<a href="https://example.com/page" rel="nofollow noopener" target="_blank">示例</a>注意 `nofollow` 只影响权重传递,不影响点击。它不该被当成「处理坏链接」的万能药——一条指向垃圾站的链接,加 nofollow 之后依然在告诉读者「这里值得一看」。真正变质的链接应该删,而不是打标签。
四、留 410 页面 / 保持不动。如果链接指向的页面确实存在但暂时不可访问,可以观察一两个月再说。频繁改动链接本身对页面也有成本。
把四种手段做成一张判定表会更省事:链接 404 且语义依赖它 → 替换;404 但只是顺带提及 → 删除;200 但内容变质 → 删除;200 且弱相关 → nofollow;200 且强相关 → 保留。
六、Disavow 该不该用
Disavow(拒绝链接工具)针对的是入站垃圾外链,不是出站链接。它对出站链接完全无效——这一点每年都有人在站长群里问,值得写清楚。
关于入站垃圾外链要不要 Disavow,目前的主流判断是:
- 不用主动做。搜索引擎对「被动获得的低质量链接」有识别能力,绝大多数垃圾外链不会导致处罚。花时间做 Disavow 对排名的正向作用几乎没有。
- 需要做的情况只有两种:一是收到人工处罚通知(手动操作),二是明显有组织的负面 SEO 攻击(短时间内大量锚文本堆砌指向同一关键词)。
- 做的时候只提交被认定的那批域名,不要「宁可错杀」地把大量正常域名也加进去。误拒正常链接的损失远大于忽略几条垃圾链接。
换句话说,Disavow 是一个「收到通知后的应对工具」,不是一个「日常优化手段」。把精力放在出站链接审计上,收益更确定。
七、把审计变成月度例行
一次性审计做完,三个月后又会积累新的坏链。要让它持续有效,就得固化节奏。我的做法是把整个流程拆成三个可执行的动作,写在月度清单里:
- 每月一次状态扫描:跑第二节和第三节的两个脚本,只看 404、410 和停放页。十分钟出结果。
- 每季度一次内容抽检:按域名出现频次取前 20 个域名,人工点开看内容是否变质。这一步必须人工。
- 每次发布新文章后:新写的文章里的外链在发布前就过一遍,别等积累到月度扫描才处理。
执行三个月后,可以把每次的结果存下来做趋势对比。一个健康的站点,坏链数量应该稳定在个位数;如果每次扫描都能扫出十几个新坏链,说明站点的外链策略本身需要调整,比如少链向个人博客、多链向官方文档和开源项目主页——后者的生命周期长得多。
八、小结
外链审计的价值常常被低估,因为它不像「发一篇新文章」那样有立即可见的产出。但它属于那种「做了没人夸、不做会慢慢积累」的基础工作。核心就三句话:定期把出站链接全量导出来扫一遍,按状态码和内容相关性分档,然后按「替换优先、删除其次、nofollow 最后」的顺序处理。至于 Disavow,除非收到人工处罚,否则不用碰。把这三件事变成月度习惯,比每年想起来做一次大扫除有效得多。